数据结构实验报告—停车场问题
实验二栈和队列实验报告---停车场问题
数据结构实验报告实验二栈和队列实验班级:计12-2 姓名:毛文祥学号12101020223一.实验目的熟悉栈和队列的基本特性,掌握栈和队列基本运算的实现过程。
重点掌握栈和队列各种操作的实现。
二.问题描述设停车场内只有一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出,汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道上等候, 一旦有车开走,则排在便道上的第一辆车即可开入,当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,试为停车场编制按上述要求进行管理的模拟程序。
三.需求分析该停车场问题可以理解为栈和队列的结合,因为停车场内部是先进入的车辆放到最北面,之后进来的车辆依次排到南面,如果有车辆要出去,那么在它之后进入的车辆必须先退出,给这个车辆让路,这个车辆出去之后再返回到停车场,这就是栈的先进后出的操作一致,因此选择栈存储停车场内的车辆,而便道上的车辆则不同,便道上的车辆,进来之后就排在最西边,如果有车辆要出去,那么在它之前车辆必须依次排到队尾,之后这个车辆开出便道,这和队列的先进先出操作一致,因此用队列存储便道上的车辆。
四.系统设计1.数据结构定义:struct Park{int status;//车的状态,0表示进入,1表示离开int num;//车的牌号int time;//车离开或者进入的时间};//车的基本信息的结构体定义typedef struct{struct Park *base;//栈底指针struct Park *top;//栈顶指针int stacksize;}SqStack;栈数据结构定义队列数据结构类型定义typedef struct QNode{struct Park data;//数据域struct QNode *next;}QNode,*Queueptr;typedef struct{Queueptr front;//队头指针Queueptr rear;//队尾指针}LinkQueue;2.基本操作描述void InitStack(SqStack &S);//初始化一个栈void Push(SqStack &S,struct Park e);//压入一个栈顶元素struct Park GetTop(SqStack &S);//得到栈顶元素,函数的返回值为存放车的信息的结构体变量struct Park Pop(SqStack &S);//删除栈顶元素,且函数的返回值为栈顶元素int EmptyStack(SqStack S);//判断一个栈是否为空,空返回1,非空返回0void VisitStack(SqStack S);//遍历一个栈而且输出栈元素的信息,输出顺序为从栈底元素到栈顶元素 void InitQueue(LinkQueue &Q);//初始化一个队列void InsertQueue(LinkQueue &Q,struct Park e);//在队列的队尾处中插入一个元素void DeleteQueue(LinkQueue &Q);//删除队头元素void VisitQueue(LinkQueue Q);//遍历队列,且输出队列元素信息,按照从队头到队尾的顺序输出void DQueue(LinkQueue &Q,struct Park e);//在队列中删除元素信息的数据域中的num值和e的num相等的元素int DStack(SqStack &S,struct Park p,double &d);//在栈中查找是否有与p的num值相等的元素,如果找到,改变d的值,函数值返回1,否则函数值返回03.主程序模块处理过程描述首先输入该车辆信息,判断是否是输入结束标志,是则跳出循环,否则判断是否是进入的车辆,如果是进入的车辆,那么判断此时栈是否已经满了,如果此时栈已满,那么该车辆就要入队列,否则入栈。
数据结构实验报告—停车场问题
数据结构实验报告—停车场问题《计算机软件技术基础》实验报告I—数据结构实验二:停车场管理问题一、问题描述1.实验题目:设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。
若停车场内已经停满 n 辆车,那么后来的车只能在门外的便道上等候。
一旦有车开走,则排在便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
2.基本要求:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。
每一组输入数据包括三个数据项:汽车的“到达”(‘A’表示)或“离去”(‘D’表示)信息、汽车标识(牌照号)以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
3.测试数据:设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
其中:(‘A’,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,1,15)表示1号牌照车在15这个时刻离去。
二、需求分析1.程序所能达到的基本可能:本程序用来模拟一个可停放n辆车的停车场的停车管理问题。
数据结构实验(停车场问题)
《数据结构》课程实验实验报告题目:停车场管理专业:计算机科学与几技术ﻩ班级:姓名: ﻩ学号:ﻩ完成日期:一、试验内容设停车场就是一个可以停放n辆汽车得狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间得先后顺序,依次由北向南排列(大门在最南端,最先到达得第一辆车停放在车场得最北端),若车场内已经停满n辆汽车,则后来得汽车只能在门外得便道上等候,一旦有车开走,则排在便道上得第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入得车辆必须先退出场为它让路,待该辆车开出大门外,其她车辆再按次序进入车场,每辆停放在车场得车在它离开停车场时必须按它停留得时间长短交纳费用,试为停车场编制按上述要求进行管理得模拟程序.以栈模拟停车场,以队列模拟车场外得便道,按照从终端读入得输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去得时刻。
对一组输入数据进行操作后得输出信息为:若就是车辆到达,则输出汽车在停车场内或便道上得停车位置;若就是车辆离去,则输出汽车在停车场内停留得时间与应交纳得费用(在便道上停留得时间不收费)。
二、试验目得(1)深入了解栈与队列得特性,掌握栈与队列得存储方法.(2)掌握栈与队列得基本操作,如初始化、入栈(队列)、出栈(队列)等,并能在实际问题背景下灵活运用。
三、流程图四、源程序代码#include<stdio、h>#include<stdafx、h〉void main(){struct cc1{int hm1,sk1;ﻩ}a[5];//停车场struct bd{inthm2,sk2;ﻩ}b[5];//便道ﻩstruct cc2ﻩ{ﻩﻩinthm3,sk3;}c[4];//存放从停车场内退出得车int p=0,q=0,x=0,n,y,t,r,i,j,g,h,z;char m;printf(”输入停车场容量与每分钟收费\n”);ﻩscanf(”%d%d”,&n,&y);printf(”输入数据:\n");for(;;){ﻩscanf(”%c",&m);//判断输入数据ﻩﻩif(m=='e'||m==’E’)ﻩbreak;ﻩscanf("%d%d",&t,&r);//t表示车牌号,r表示时间//车到达ﻩif(m=='a'||m=='A'){ﻩif(p<n)ﻩﻩ{//n表示停车场容量,p表示场内车得数量ﻩa[p]、hm1=t;ﻩﻩﻩﻩa[p]、sk1=r;ﻩﻩprintf("车停在停车厂内%d号位置、\n",p+1);ﻩﻩﻩp++;ﻩﻩ}ﻩ//车停在便道内elseﻩﻩ{ﻩﻩb[q]、hm2=t;ﻩﻩﻩﻩb[q]、sk2=r;ﻩprintf("车停在便道上%d号位置、\n",q+1);ﻩﻩq++;ﻩﻩ}ﻩﻩ}//车离开ﻩﻩif(m==’d'||m=='D')ﻩﻩ{h=p;ﻩﻩﻩfor(i=0;i<p;i++,g=i)ﻩﻩﻩif(a[i]、hm1==t)ﻩﻩ{//判断车就是否停在场内ﻩﻩp--;ﻩﻩif(i==p)//如果车停在场内最后一位ﻩﻩﻩprintf(”%d号车在停车厂内停留了%d分钟,应交纳%d元钱、\n”,t,r-a[i]、sk1,y*(r-a[i]、sk1));ﻩelseﻩﻩ{//在它之后进入得车辆先退出场为它让路ﻩfor(j=p;j>i;j-—)ﻩﻩ{ﻩﻩﻩﻩc[x]、hm3=a[j]、hm1;ﻩﻩﻩﻩc[x]、sk3=a[j]、sk1;ﻩﻩﻩx++;ﻩﻩﻩ}ﻩﻩﻩﻩprintf(”%d号车在停车厂内停留了%d分钟,应交纳%d元钱、\n”,t,r-a[i]、sk1,y*(r—a[i]、sk1));ﻩﻩﻩﻩﻩfor(j=i;x—1〉=0;x--,j++)ﻩﻩﻩﻩ{//退出得车再进入停车场内ﻩﻩﻩﻩa[j]、hm1=c[x—1]、hm3;ﻩﻩﻩﻩﻩa[j]、sk1=c[x-1]、sk3;ﻩ}}ﻩﻩﻩﻩif(q!=0)ﻩﻩﻩﻩ{//便道内得车进入停车场ﻩﻩﻩa[p]、hm1=b[0]、hm2;ﻩﻩﻩa[p]、sk1=r;ﻩﻩﻩﻩp++;ﻩﻩﻩfor(j=0;j<q-1;j++)ﻩﻩﻩﻩ{ﻩﻩﻩb[j]、hm2=b[j+1]、hm2;ﻩﻩb[j]、sk2=b[j+1]、sk2;ﻩﻩ}ﻩq-—;ﻩﻩﻩ}ﻩbreak;}ﻩﻩﻩ//判断车就是否停在便道上ﻩﻩfor(i=0;i〈q;i++,z=q)ﻩﻩﻩif(b[i]、hm2==t)ﻩ{ﻩﻩﻩﻩprintf(”该车停留在便道内,不收费、\n");ﻩfor(j=i;j〈q-1;j++)ﻩﻩ {ﻩﻩ b[j]、hm2=b[j+1]、hm2;ﻩﻩﻩb[j]、sk2=b[j+1]、sk2;ﻩﻩ}ﻩq—-;ﻩﻩ break;ﻩﻩ}if(g==h&&i==z) printf(”无该车、\n");ﻩﻩﻩ}ﻩ}}五、调试过程调试过程中,车离开得那一部分经常出现错误,运行结果与预想得不太一样,后来发现就是停车场得计数器那出现了问题,使离开后再进入停车场得位置发生了错误.如果输入得离开时间比到达得时间小,则会出现付费为负值。
数据结构-停车场-实验报告与代码
一.需求分析1、题目要求:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
若停车场已经停满n辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,每两停在车场的车要安时间长短缴费。
要求:以栈模拟停车场,以队列车场外的便道,按照从终端输入的数据序列进行模拟管理。
每一组数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、以及到达或离去的时刻。
对每一组数据进行操作后的信息为:若是车辆到达,则输出汽车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
2、程序能达到的功能:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。
二.算法设计本程序中采用的数据模型,用到的抽象数据类型的定义,程序的主要算法流程及各模块之间的层次调用关系程序基本结构:结构体定义:(1)车辆信息的表示车辆可看成是一个节点,设计成一个结构体,定义如下:typedef struct node{char num[10]; //车牌号码Time reach; //到站时间Time leave; //离开时间}CarNode;(2)时间、栈和队列的定义时间是由小时和分钟表示的,有两部分数据,定义如下:typedef struct time{int hour;int min;}Time;停车场内用栈表示:typedef struct NODE{CarNode *stack[MAX+1]; //栈用顺序表示int top;}SeqStackCar;便道上的车辆表示:typedef struct car{CarNode *data; // 便道上的车用链表表示truct car *next;}QueueNode;typedef struct Node{QueueNode *head; // 设置头指针、尾指针。
数据结构停车场问题
park[Ntop].Carnumber = p->bcar.Carnumber;
park[Ntop].ADtime = aCar.ADtime;
Northroad->next = p->next;
delete p;
}
if(Southroad->next != NULL && Northroad->next == NULL)
BCar *Southroad; //南门便道起始指针
BCar *Southtail; //南门便道尾指针
int n; //停车场车位数
int fee; //单位时间的停车费用
int Stop; //停车场栈南头指针
int Ntop; //停车场栈北头指针
int Temptop; //临时转车场栈头指针
{
cout<<"车到达时间输入有误!(时间要小于之前车辆到达的时间)"<<endl;
cout<<"重新输入车的信息!"<<endl;
continue;
}
for(i = Ntop;i < n;i++)
{
if(park[i].Carnumber == aCar.Carnumber)
{
cout<<"车牌号码已经存在!重新输入车的信息!"<<endl;
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车出进。汽车在停车场内按车辆到达的时间先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它的车辆在按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序
数据结构停车场问题实验报告
数据结构课程设计——停车场管理问题姓名:学号:一、问题描述设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
二、实现要求要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
三、实现提示汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。
例如,(‘A’,,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,,5,20)表示5号牌照车在20这个时刻离去。
整个程序可以在输入信息为(‘E’,0,0)时结束。
本题可用栈和队列来实现。
四、需求分析停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。
停车场的管理流程如下①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。
②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。
当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队列头取出一辆车压入栈中。
五、流程图六、详细设计1.本程序主要包含四个模块1) 主程序模块int main(){Initialization();CarNode car;SqStack Park,TempPark;LinkQueue Q;InitStack(Park);InitStack(TempPark);InitQueue(Q);while((scanf("%c%d%d",&car.event,&car.num,&car.time))&&(car.event!='e'&&car .event!='E')){getchar();//除去输入结束时的回车switch(car.event){case 'A':case 'a':Arrive(Park,Q,car);break;case 'D':case 'd':Leave(Park,TempPark,Q,car);break;default: printf("您的第一个数据输入有误!\n");break;}}printf("程序结束,谢谢使用!\n");return 0;2)分别构造空栈和空队列栈:Status InitStack(SqStack &S){ //构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));if(!S.base){exit(OVERFLOW);printf("存储空间分配失败");}S.top=S.base;return OK;}队列:Status InitQueue(LinkQueue &Q){ //构造一个空队列(带头结点)Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));if(!Q.front){exit(OVERFLOW);printf("存储空间分配失败");}Q.front->next=NULL;Q.queuesize=0;return OK;3)车辆到达处理Status Arrive(SqStack &S,LinkQueue &Q,CarNode &e){ //车辆到达处理if((S.top-1)->time<=e.time){ //时间处理if(!Check_Stack(S,e)&&!Check_Queue(Q,e)){ //是否已存在if(S.top-S.base<MAX){Push(S,e);printf("成功进入停车场,在%d号车库!\n",S.top-S.base);return OK;}else{EnQueue(Q,e);printf("停车场已满,车辆进入便道,在%d号车位!\n",Q.queuesize);}}elseprintf("该牌照的车已存在,输入有误,请重新输入\n");return OK;}else{printf("时间输入有误,请重新输入!\n");return FALSE;}}4)车辆离开处理Status Leave(SqStack &S,SqStack &TempS,LinkQueue &Q,CarNode &e){//车辆离开处理CarNode a;int leatime,leanum;intentertime; //进入停车场时间int cost;if(!(Check_Stack(S,e) || Check_Queue(Q,e))){printf("数据输入错误,本停车场内无所查询车辆,请重新输入!\n");return true;}else{if(Check_Stack(S,e)) //若需要离开的车辆在停车场{if(e.num==(S.top-1)->num)//车辆处在栈顶{Pop(S, a);leatime=e.time;leanum=e.num;entertime=a.time;printf("车辆进入车库时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);}else//车辆处在栈中间{do{Pop(S,a);//从栈中依次退出Push(TempS,a);//依次进入临时栈}while((S.top-1)->num!=e.num);//直到top指针下一个位置的num=车牌号Pop(S,a); //该车离开leatime=e.time;leanum=e.num;entertime=a.time;printf("车进入停车场时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);do{ //其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);}while(TempS.top!=TempS.base);//条件与上面不同,此时是全部回去}cost=(leatime-entertime)*price;if(cost>=0)printf("您的车牌号为 %d 的车应交纳的费用是:%d\n",leanum,cost);if(Q.front!=Q.rear){//队列不空的话从便道进停车场DeQueue(Q,a);if(a.time<leatime) //便道车辆进车库时间应该比车库车辆离开时间晚entertime=leatime;a.time=leatime;Push(S,a);//该车进入停车场printf("车牌号为%d的车辆从便道上进入%d号车库!从现在开始计时,现在时间为:%d\n",a.num,S.top-S.base,a.time);}}else if(Check_Queue(Q,e)){ //从便道直接离开do{DeQueue(Q,a);EnQueue(Q,a);}while(Q.front->next->data.num!=e.num);DeQueue(Q,e);//前面的车进入队尾printf("您的车牌号为 %d 的车辆未进入车库从便道直接离开,费用为0!\n",e.num);}}return true;2.主要设计程序如下#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define MAX 2 //停车场容量#define price 2 //单价#define OK 1#define FALSE 0#define TRUE 1#define ERROR -1#define OVERFLOW -2typedef int Status;//===================================================================== typedef struct CarNode{char event;int num;int time;}CarNode; //车辆信息结点typedef struct SqStack{CarNode *base;CarNode *top;int Stacksize;}SqStack; //栈(停车场)typedef struct QNode{CarNode data;struct QNode *next;}QueueNode; //便道结点typedef struct LinkQueue{QueueNode *front;QueueNode *rear;int queuesize;}LinkQueue; //队列(便道)//===================================================================== Status InitStack(SqStack &S){ //构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc((MAX)*sizeof(CarNode));if(!S.base){exit(OVERFLOW);printf("存储空间分配失败");}S.top=S.base;return OK;}//===================================================================== Status InitQueue(LinkQueue &Q){ //构造一个空队列(带头结点) Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode));if(!Q.front){exit(OVERFLOW);printf("存储空间分配失败");}Q.front->next=NULL;Q.queuesize=0;return OK;}//=====================================================================Status GetTop(SqStack S,CarNode &e){ //返回栈顶元素if(S.top==S.base)return ERROR;e=*(S.top-1);return TRUE;}//===================================================================== Status Pop(SqStack &S,CarNode &e){ //删除栈顶元素if(S.top==S.base)return ERROR;e=*--S.top;return OK;}//===================================================================== Status Push(SqStack &S,CarNode e){//插入元素为新的栈顶元素(在栈不满的前提下) if(S.top-S.base>=MAX)return FALSE;*S.top++=e;return OK;}//===================================================================== Status DeQueue(LinkQueue &Q,CarNode &e){ //删除队头元素(带头结点) if(Q.rear==Q.front)return ERROR;QueueNode *p=Q.front->next;e=p->data;Q.front->next=p->next;if(p==Q.rear)Q.rear=Q.front;free(p);Q.queuesize--;return OK;}//===================================================================== Status EnQueue(LinkQueue &Q,CarNode e){ //插入新的队尾元素QueueNode *p=(QueueNode*)malloc(sizeof(QueueNode));if(!p)exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;Q.queuesize++;return OK;}//===================================================================== Status Check_Stack(SqStack &S,CarNode e){//车辆到达时车库内是否有同名车 CarNode *Temp=S.base;while((Temp!=(S.top))&&(Temp->num!=e.num))Temp++;if((Temp==S.top))return FALSE;elsereturn TRUE;}//===================================================================== Status Check_Queue(LinkQueue &Q,CarNode e){//车辆到达时便道上是否有同名车 QueueNode *Temp=Q.front;while((Temp!=Q.rear) && (Temp->data.num!=e.num))Temp=Temp->next;if((Temp==Q.rear) && (Temp->data.num!=e.num))return FALSE;elsereturn TRUE;}//=====================================================================Status Arrive(SqStack &S,LinkQueue &Q,CarNode &e){ //车辆到达处理if((S.top-1)->time<=e.time){ //时间处理if(!Check_Stack(S,e)&&!Check_Queue(Q,e)){ //是否已存在if(S.top-S.base<MAX){Push(S,e);printf("成功进入停车场,在%d号车库!\n",S.top-S.base);return OK;}else{EnQueue(Q,e);printf("停车场已满,车辆进入便道,在%d号车位!\n",Q.queuesize);}}elseprintf("该牌照的车已存在,输入有误,请重新输入\n");return OK;}else{printf("时间输入有误,请重新输入!\n");return FALSE;}}//=====================================================================Status Leave(SqStack &S,SqStack &TempS,LinkQueue &Q,CarNode &e){//车辆离开处理CarNode a;int leatime,leanum;intentertime; //进入停车场时间int cost;if(!(Check_Stack(S,e) || Check_Queue(Q,e))){printf("数据输入错误,本停车场内无所查询车辆,请重新输入!\n");return true;}else{if(Check_Stack(S,e)) //若需要离开的车辆在停车场{if(e.num==(S.top-1)->num)//车辆处在栈顶{Pop(S, a);leatime=e.time;leanum=e.num;entertime=a.time;printf("车辆进入车库时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);}else//车辆处在栈中间{do{Pop(S,a);//从栈中依次退出Push(TempS,a);//依次进入临时栈}while((S.top-1)->num!=e.num);//直到top指针下一个位置的num=车牌号Pop(S,a); //该车离开leatime=e.time;leanum=e.num;entertime=a.time;printf("车进入停车场时间:%d\t现在(离开)时间:%d\t停留时间:%d\t\n",entertime,leatime,leatime-entertime);do{ //其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);}while(TempS.top!=TempS.base);//条件与上面不同,此时是全部回去}cost=(leatime-entertime)*price;if(cost>=0)printf("您的车牌号为 %d 的车应交纳的费用是:%d\n",leanum,cost);if(Q.front!=Q.rear){//队列不空的话从便道进停车场DeQueue(Q,a);if(a.time<leatime) //便道车辆进车库时间应该比车库车辆离开时间晚entertime=leatime;a.time=leatime;Push(S,a);//该车进入停车场printf("车牌号为%d的车辆从便道上进入%d号车库!从现在开始计时,现在时间为:%d\n",a.num,S.top-S.base,a.time);}}else if(Check_Queue(Q,e)){ //从便道直接离开do{DeQueue(Q,a);EnQueue(Q,a);}while(Q.front->next->data.num!=e.num);DeQueue(Q,e);//前面的车进入队尾printf("您的车牌号为 %d 的车辆未进入车库从便道直接离开,费用为0!\n",e.num);}}return true;}//=====================================================================voidInitialization(){ //初始化程序printf("姓名:杨智伟学号:2012040651\n");printf("==========================================================\n");printf("* 停车场管理模拟程序 *\n");printf("==========================================================\n");printf("请依次输入车辆到达(A/a)/离去(D/d)/结束(E/e)信息、车牌号以及当前时间:\n\n");}//=====================================================================int main(){Initialization();CarNode car;SqStack Park,TempPark;LinkQueue Q;InitStack(Park);InitStack(TempPark);InitQueue(Q);while((scanf("%c%d%d",&car.event,&car.num,&car.time))&&(car.event!='e'&&car .event!='E')){getchar();//除去输入结束时的回车switch(car.event){case 'A':case 'a':Arrive(Park,Q,car);break;case 'D':case 'd':Leave(Park,TempPark,Q,car);break;default: printf("您的第一个数据输入有误!\n");break;}}printf("程序结束,谢谢使用!\n");return 0;}七、程序运行截图1.交互界面2.车辆进入3.车辆离去4.停车场已满进入便道5.便道车辆进入车库6.程序结束界面八、实验总结1.学会了栈和队列的综合使用,更加灵活运用栈和队列。
数据结构上机--停车场管理问题
实习指导[实习题目]:停车场管理。
[实习内容]:首先,实现栈和队列的基本操作,在此基础上,实现停车场管理。
停车场管理问题描述:设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。
在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端).若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回车场。
每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。
试编写程序,模拟上述管理过程。
要求以顺序栈模拟停车场,以链队列模拟便道。
从终端读入汽车到达或离去的数据,每组数据包括三项:①是“到达”还是“离去";②汽车牌照号码;③“到达”或“离去"的时刻。
与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。
(提示:需另设一个栈,临时停放为让路而从车场退出的车.)[实习目的]:通过实习,熟悉栈和队列的基本特点,掌握利用栈和队列解决具体问题的方法。
[实习步骤]:1.实现顺序栈的基本操作●基本思路首先实现一个整型顺序栈的初始化、判栈空、进栈、出栈等基本操作,并在主程序中调用这些操作。
●基本框架#include 〈stdio.h>#define TRUE 1#define FALSE 0#define Stack_Size 50typedef int StackElementType;typedef struct{StackElementType elem[Stack_Size];int top;}SeqStack;/* 以下是函数原形说明。
注意函数头后面有分号。
*/void InitStack(SeqStack *s);intIsEmpty(SeqStack *s);int Push(SeqStack *s,StackElementType e);int Pop(SeqStack *s,StackElementType *e);/*以下是函数定义.注意函数头后面无分号。
数据结构-停车场管理系统实验报告
数据结构-停车场管理系统实验报告数据结构停车场管理系统实验报告一、实验目的本次实验旨在通过设计和实现一个停车场管理系统,深入理解和应用数据结构的知识,包括栈、队列、链表等,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、需求分析1、停车场内有固定数量的停车位。
2、车辆进入停车场时,记录车辆信息(车牌号、进入时间)。
3、车辆离开停车场时,计算停车费用并输出相关信息。
4、能够显示停车场内车辆的停放情况。
四、数据结构设计1、为了实现车辆的先进先出,选择队列来存储停车场内的车辆信息。
2、用栈来存储临时停放的车辆信息,以便在停车场已满时进行处理。
五、算法设计1、车辆进入停车场检查停车场是否已满。
如果未满,将车辆信息加入队列,并记录进入时间。
2、车辆离开停车场在队列中查找要离开的车辆。
计算停车时间和费用。
将车辆从队列中删除。
3、显示停车场内车辆停放情况遍历队列,输出车辆信息。
六、主要代码实现```cppinclude <iostream>include <string>include <ctime>using namespace std;//车辆结构体struct Car {string licensePlate; //车牌号time_t entryTime; //进入时间};//队列类class Queue {private:Car data;int front, rear, capacity;public:Queue(int size) {capacity = size;data = new Carcapacity;front = rear = 0;}~Queue(){delete data;}bool isFull(){return (rear + 1) % capacity == front;}bool isEmpty(){return front == rear;}void enqueue(Car car) {if (isFull()){cout <<"停车场已满!"<< endl; return;}datarear = car;rear =(rear + 1) % capacity;}Car dequeue(){if (isEmpty()){cout <<"停车场为空!"<< endl;return Car();}Car car = datafront;front =(front + 1) % capacity;return car;}void display(){if (isEmpty()){cout <<"停车场内没有车辆。
停车场数据结构实验报告附代码
数据结构实验报告——实验三停车场模拟管理程序的设计与实现本实验的目的是进一步理解线性表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。
一、【问题描述】设停车场只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该车辆开出大门,为它让路的车辆再按原次序进入车场。
在这里假设汽车不能从便道上开走,试设计这样一个停车场模拟管理程序。
为了以下描述的方便,停车场的停车场用“停车位”进行叙述,停车场的便道用“便道”进行叙述。
二、【数据结构设计】1、为了便于区分每辆汽车并了解每辆车当前所处的位置,需要记录汽车的牌照号码和汽车的当前状态,所以为汽车定义一个新的类型CAR,具体定义如下:typedef struct{char *license //汽车牌照号码,定义为一个字符指针类型char state; //汽车当前状态,字符s表示停放在停车位上,//字符p表示停放在便道上,每辆车的初始状态用字符i来进行表示}2、①由于车位是一个狭长的通道,所以不允许两辆车同时出入停车位,当有车到来要进入停车位的时候也要顺次停放,当某辆车要离开时,比它后到的车要先暂时离开停车位,而且越后到的车就越先离开停车位,显然这和栈的“后进先出”特点相吻合,所以可以使用一个栈来描述停车位。
由于停车位只能停放有限的几辆车,而且为了便于停车场的管理,为每个车位要分配一个固定的编号,不妨设为1、2、3、4、5(可利用数组的下标),分别表示停车位的1车位、2车位、3车位、4车位。
5车位,针对这种情况使用一个顺序栈比较方便。
②当某辆车要离开停车场的时候,比它后进停车位的车要为它让路,而且当它开走之后让路的车还要按照原来的停放次序再次进入停车位的某个车位上,为了完成这项功能,再定义一个辅助栈,停车位中让路的车依次“压入”辅助栈,待提出开走请求的车开走后再从辅助栈的栈顶依次“弹出”到停车位中。
数据结构报告 停车场问题
⒈问题描述:停车场管理问题[问题描述]设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
[实现要求]要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
[实现提示]汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。
例如,(‘A’,,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,,5,20)表示5号牌照车在20这个时刻离去。
整个程序可以在输入信息为(‘E’,0,0)时结束。
本题可用栈和队列来实现。
⒉设计:⑴数据结构设计和核心算法设计描述;停车场管理系统是充分利用数据结构中栈和队列的思想实现的,栈是一种只能在叫做栈的一段进行进栈或者出栈操作的线性数据结构。
栈的主要特点是”后进先出”,即后进栈的元素先处理。
停车场的容量即为栈的存储空间,停车场的车辆的停靠是无秩序的,因此采用链式存储的方式更适合,也方便车辆的调度。
队列是限定仅能在表的一端进行插入,在表的另一端进行删除的线性表。
队列中可以插入的一端称为队尾,可以删除的一端称为队首。
把一个元素插入队列中的操作为进队,队列中删除一个元素的操作为出队。
队列存取操作符合:先进先出。
停车场的车辆到达停车和车辆的离开的管理方式就是采用队列的“先进先出”的移动的思想。
数据结构实验报告模拟停车场管理
数据结构实验报告模拟停车场管理实验目的:通过模拟停车场管理的过程,理解数据结构的应用和实际工程问题的解决思路。
实验内容:1.设计停车场类和车辆类,并实现相关操作方法。
2.模拟停车场管理的过程,包括车辆的进入和离开。
3.根据实际需求设计停车场管理算法,如何选择停车位和调度车辆等。
实验步骤:1.设计停车场类停车场类需要保存停车位的信息,可以使用数组或链表实现。
需要提供以下方法:- void addCar(Car car):将车辆添加到停车场,如果停车场已满,则禁止入场。
- void removeCar(Car car):将车辆从停车场移除,并更新停车位信息。
- int getAvailableSpaces(:返回停车场中当前可用的停车位数量。
2.设计车辆类车辆类需要保存车辆的信息,如车牌号、车型等。
3.实现停车场管理算法停车场管理需要考虑车辆进入和离开的顺序,以及停车位的选择等问题。
可以使用队列或堆栈等数据结构来保存车辆的进出顺序。
停车位的选择可以根据具体算法进行,如先到先得、最近最便等原则。
4.完成模拟停车场管理过程的代码根据实际需求,编写代码模拟车辆进入和离开停车场的过程。
可以通过输入车辆信息和操作指令来模拟。
5.测试与优化对停车场管理算法进行测试,并根据实际情况进行优化。
可以通过增加数据量、调整车辆进出顺序等方式进行测试,并根据测试结果进行优化。
实验结果:经过实验测试,停车场管理系统可以良好地处理车辆的进入和离开,并正确计算可用停车位的数量。
通过合理的停车位选择算法,确保了车辆进出的顺序。
实验总结:通过本次实验,我们学习了如何利用数据结构来实现停车场管理系统。
停车场管理系统是一种常见的实际应用,对于解决停车难问题具有重要意义。
在实验过程中,我们掌握了设计和实现停车场类、车辆类以及停车场管理算法的方法,加深了对数据结构的理解和应用。
在实验过程中,我们还发现停车场管理算法可以通过不同的策略进行优化,如最大化停车利用率、最小化顾客等待时间等。
数据结构用栈和队列创建停车场管理系统实验报告
数据结构用栈和队列创建停车场管理系统实验报告一、实验背景及目的随着城市化进程的不断加速,车辆数量急剧增长,停车难成为了城市发展中的一个重要问题。
为了解决这一问题,需要建立高效的停车场管理系统。
数据结构中的栈和队列是常用的数据结构,可以用来创建停车场管理系统。
本次实验旨在通过使用栈和队列来创建一个停车场管理系统,并测试其功能。
二、实验原理及方法1. 停车场管理系统基本原理停车场管理系统主要包括三个部分:入口、出口和停车位。
当车辆到达入口时,需要检查是否有空余的停车位;如果有,则将其分配一个位置并记录下来;否则,需要让其等待直到有空余位置。
当车辆离开时,需要释放该位置并更新记录。
2. 使用栈和队列创建停车场管理系统(1)使用栈来模拟停车位由于每个停车位只能容纳一辆汽车,可以使用栈来模拟每个停车位。
当有新的汽车进入时,将其压入栈中;当汽车离开时,则将其从栈中弹出。
(2)使用队列来模拟等待区由于等待区可以容纳多辆汽车,可以使用队列来模拟等待区。
当有新的汽车到达时,将其加入队列尾部;当有车位空余时,则从队列头部取出一辆汽车进入停车场。
3. 实验步骤(1)创建停车场管理系统的数据结构:使用栈和队列分别来模拟停车位和等待区。
(2)实现停车场管理系统的基本操作:包括汽车进入、离开、查询空余停车位等操作。
(3)测试停车场管理系统的功能:模拟多辆汽车进出停车场,检查系统是否能够正确地分配和释放停车位,并且能够正确地记录空余停车位数。
三、实验结果与分析本次实验使用栈和队列创建了一个简单的停车场管理系统,并测试了其基本功能。
在测试过程中,我们模拟了多辆汽车进出停车场,并检查了系统能否正确地分配和释放停车位。
实验结果表明,该系统可以正常工作,并且能够正确地记录空余停车位数。
四、实验总结通过本次实验,我们学习了如何使用栈和队列来创建一个简单的停车场管理系统。
同时,我们也深刻认识到数据结构在实际应用中的重要性。
在今后的学习中,我们将继续深入学习数据结构,并探索其更广泛的应用。
数据结构实践报告--停车场管理系统
河南财经政法大学集中实践报告院系:班级:指导老师:小组:小组成员:目录(一)设计目的 (3)(二)问题描述 (3)(三)概要设计 (4)(四)详细设计 (8)(五)调试分析 (9)(六)测试分析 (10)(七)心得体会 (11)(八)附录(源代码) (12)(一)设计目的1.通过课程设计,了解并掌握数据结构的设计方法,具备初步的独立分析和设计能力;2.通过课程设计,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.通过课程设计,提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.通过课程设计,训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
(二)问题描述及要求基本要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
测试数据设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
其中:‘A’表示到达(arrival);‘D’表示离去(departure);‘E’表示输出结束(end)。
实现提示需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
此外还要实现:(1)两个栈共享空间,思考应开辟数组的空间是多少?(2)汽车可有不同种类,则他们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
数据结构停车场实习报告
一、实习背景随着我国经济的快速发展,城市车辆数量逐年攀升,停车难问题日益突出。
为了解决这一问题,我们需要设计一个高效、便捷的停车场管理系统。
本次实习以数据结构为基础,设计并实现了一个停车场管理系统。
二、实习目的1. 理解并掌握数据结构在实际问题中的应用;2. 提高编程能力和算法设计能力;3. 掌握停车场管理系统的设计与实现方法;4. 分析并解决实际问题。
三、系统设计1. 系统功能(1)车辆进出管理:实现车辆进入和离开停车场的功能,包括记录车辆信息、计算停车费用等。
(2)车位管理:实时显示停车场内剩余车位数量,实现车位分配和回收。
(3)数据统计:统计停车场使用情况,包括车辆进出次数、停车时间等。
(4)异常处理:处理车辆进出异常情况,如超时、非法操作等。
2. 数据结构设计(1)停车场:使用栈结构存储停车场内的车辆信息,栈底为停车场最里面,栈顶为停车场最外面。
(2)便道:使用队列结构存储便道上的车辆信息,队列头为便道最外面,队列尾为便道最里面。
(3)车辆信息:包括车辆牌照、进入时间、离开时间、停车费用等。
3. 算法设计(1)车辆进入停车场:判断停车场是否已满,若不满,则将车辆信息压入栈中;若满,则将车辆信息入队。
(2)车辆离开停车场:判断便道是否为空,若为空,则从栈中弹出车辆信息;若不为空,则从队列中出队车辆信息。
(3)计算停车费用:根据车辆停留时间计算停车费用。
四、实习过程1. 需求分析:了解停车场管理系统的基本需求,确定系统功能。
2. 设计阶段:设计系统架构、数据结构、算法等。
3. 编码阶段:根据设计文档,使用C++语言进行编程实现。
4. 测试阶段:编写测试用例,对系统进行功能测试、性能测试等。
5. 调试阶段:针对测试过程中发现的问题进行调试和优化。
五、实习结果1. 系统功能实现:停车场管理系统已实现车辆进出管理、车位管理、数据统计、异常处理等功能。
2. 数据结构应用:成功将栈和队列应用于停车场管理系统,提高了系统性能。
数据结构停车场问题
一、需求分析1.车辆目前情况,用户通过键盘输入,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间(离开时间减去停在停车场的时间)和应交纳的费用(在便道上停留的时间不收费)。
2.依次输入一系列数据项(3个数据:第一个字符数据A或D表示车辆的到达或离开,第二整形数据表示车辆的车牌号码,第三个整形数据表示汽车到达或离去的时间),要求同一辆汽车到达的时间比离开的时间早。
3.测试数据设停车场能容纳3辆车。
请输入车辆目前情况:A ,1,51车辆停入停车场1号。
请输入车辆目前情况:A ,2,61车辆停入停车场1号2车辆停入停车场2号。
请输入车辆目前情况:A ,3,5输入时间错误哦!请输入车辆目前情况:A ,3,61车辆停入停车场1号2车辆停入停车场2号。
3车辆停入停车场3号。
请输入车辆目前情况:A ,4,61车辆停入停车场1号。
2车辆停入停车场2号。
3车辆停入停车场3号。
4车辆在便道1号。
停车场已满。
4车辆已放在便道。
请输入车辆目前情况:D ,1,71车辆已离开。
时间5,收费10块。
2车辆停入停车场1号。
3车辆停入停车场2号。
4车辆停入停车场3号。
请输入车辆目前情况:E ,0,0程序结束,感谢使用本程序哦。
本程序其他错误处理,没有设置处理。
二、概要设计抽象数据类型基本操作对象是汽车类,包含来去信息,车牌号以及到达时间;Class Car//车辆信息{Public:int Lincese ;//车牌号int ArriveTime ;//到达时间};便道先进先出的特性用队列是十分好的,但停车场有一个要求就是先进的要出去时,所有车辆都要让路,所以停车场用栈来模拟,便道使用队列来模拟; ADT StopStack数据对象:D={i a |i a ∈class car};数据关系:R1={ <ai-1, ai >| ai-1, ai ∈D, i=2,...,n }约定an 端为栈顶,a1 端为栈底。
数据结构停车场收费系统管理实践报告
数据结构停车场收费系统管理实践报告停车场收费系统,这个话题一提起来,大家都不陌生。
说实话,谁没在大街小巷的停车场为了一块停车费而头疼过呢?尤其是在城市里,停车位稀缺,收费又是天价,弄得有时候进个停车场就像进了赌场,不知道到底会“亏”多少。
今天就聊聊我最近搞的一次“停车场收费系统管理实践”,说实话,整个过程就像是看一部高能悬疑片,既有趣又有点小紧张。
停车场的管理,说白了,就是得搞清楚停车位的利用率,然后合理收费,确保不亏本。
这听起来简单,但要做好,光靠脑袋里的想法可不行。
得用点“硬核”的东西,比如数据结构。
说到这里,很多人可能开始懵了:数据结构?那是啥?别担心,数据结构就是一堆有序的、按照特定规则组织起来的数据,简单点说,就是停车场的“内部管理”嘛。
比如你停车时,停车场会分配一个车位给你,那些车位就得按照一定的规则排序,不然你想找个位置就得像大海捞针一样。
我们做的这个停车场收费系统,首先就要搞清楚如何让停车位、车主和收费三个元素高效地“打交道”。
你想,假如停车场没有规则,那就乱套了,车位没人用,车主也找不到地方停车,收费自然就乱七八糟了。
搞清楚了这些,系统的基础架构就稳了。
说到收费,最常见的就是按时间收费。
我们通过程序算出来每个车主停车的时长,再按照预设的费用标准进行结算。
这里就得用到“链表”这个数据结构了。
车主的停车信息就像一颗颗“珠子”串在一起,每个珠子里面有车主的停车时间、车牌号、停车收费等数据。
如果一个车主停车时间很长,那收费就得按时间增加,反之,停车时间短,自然收费也少。
这种管理方式非常高效,不容易出错,而且能够快速计算每个车主的停车费。
哎,说实话,我一开始听到链表这俩字儿时,还挺疑惑的,感觉好像很“高大上”,但一弄明白后,才发现原来就是个简单又实用的东西,跟停车场的条理化管理一样,处理起来简洁又明了。
再说到停车收费的“智能化”,以前我们去停车场,不是排队等着人工收费,就是站在收费亭前一脸懵逼,不知道到底该怎么付。
数据结构报告 停车场问题
⒈问题描述:停车场管理问题[问题描述]设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
[实现要求]要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
[实现提示]汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。
例如,(‘A’,,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,,5,20)表示5号牌照车在20这个时刻离去。
整个程序可以在输入信息为(‘E’,0,0)时结束。
本题可用栈和队列来实现。
⒉设计:⑴数据结构设计和核心算法设计描述;停车场管理系统是充分利用数据结构中栈和队列的思想实现的,栈是一种只能在叫做栈的一段进行进栈或者出栈操作的线性数据结构。
栈的主要特点是”后进先出”,即后进栈的元素先处理。
停车场的容量即为栈的存储空间,停车场的车辆的停靠是无秩序的,因此采用链式存储的方式更适合,也方便车辆的调度。
队列是限定仅能在表的一端进行插入,在表的另一端进行删除的线性表。
队列中可以插入的一端称为队尾,可以删除的一端称为队首。
把一个元素插入队列中的操作为进队,队列中删除一个元素的操作为出队。
队列存取操作符合:先进先出。
停车场的车辆到达停车和车辆的离开的管理方式就是采用队列的“先进先出”的移动的思想。
数据结构实践报告--停车场管理系统
数据结构实践报告--停车场管理系统河南财经政法⼤学集中实践报告院系:班级:指导⽼师:⼩组:⼩组成员:⽬录(⼀)设计⽬的 (3)(⼆)问题描述 (3)(三)概要设计 (4)(四)详细设计 (8)(五)调试分析 (9)(六)测试分析 (10)(七)⼼得体会 (11)(⼋)附录(源代码) (12)(⼀)设计⽬的1.通过课程设计,了解并掌握数据结构的设计⽅法,具备初步的独⽴分析和设计能⼒;2.通过课程设计,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本⽅法和技能;3.通过课程设计,提⾼综合运⽤所学的理论知识和⽅法独⽴分析和解决问题的能⼒;4.通过课程设计,训练⽤系统的观点和软件开发⼀般规范进⾏软件开发,培养软件⼯作者所应具备的科学的⼯作⽅法和作风。
(⼆)问题描述及要求基本要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读⼊的输⼊数据序列进⾏模拟管理。
每⼀组输⼊数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每⼀组输⼊数据进⾏操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费⽤(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
测试数据设n=2,输⼊数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
其中:‘A’表⽰到达(arrival);‘D’表⽰离去(departure);‘E’表⽰输出结束(end)。
实现提⽰需另设⼀个栈,临时停放为给要离去的汽车让路⽽从停车场退出来的汽车,也⽤顺序存储结构实现。
输⼊数据按到达或离去的时刻有序。
栈中每个元素表⽰⼀辆汽车,包含两个数据项:汽车的牌照号码和进⼊停车场的时刻。
此外还要实现:(1)两个栈共享空间,思考应开辟数组的空间是多少?(2)汽车可有不同种类,则他们的占地⾯积不同,收费标准也不同,如1辆客车和1.5辆⼩汽车的占地⾯积相同,1辆⼗轮卡车占地⾯积相当于3辆⼩汽车的占地⾯积。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机软件技术基础》实验报告I—数据结构实验二:停车场管理问题一、问题描述1.实验题目:设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。
若停车场内已经停满 n辆车,那么后来的车只能在门外的便道上等候。
一旦有车开走,则排在便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
2.基本要求:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。
每一组输入数据包括三个数据项:汽车的“到达”(‘A’表示)或“离去”(‘D’表示)信息、汽车标识(牌照号)以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
3.测试数据:设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
其中:(‘A’,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,1,15)表示1号牌照车在15这个时刻离去。
二、需求分析1.程序所能达到的基本可能:本程序用来模拟一个可停放n辆车的停车场的停车管理问题。
用栈和队列模拟停车场及场外通道,输入车辆状态(到达或者离开),车牌号和时间,就可显示停车位置或者该车在停车场停留时间及应缴费用。
2.输入的形式及输入值范围:程序接受5个命令,分别是:到达(‘A’,车牌号,时间);离去(‘D’,车牌号,时间);停车场(‘P’, 0, 0)显示停车场的车数;候车场(‘W’, 0, 0)显示候车场的车数;退出(‘E’, 0, 0)退出程序。
3.输出的形式:对于车辆到达,要输出汽车在停车场内或者便道上的停车位置;对于车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。
用户输入完毕后,程序自动运行输出运行结果。
4.测试数据要求:设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
其中:(‘A’,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,1,15)表示1号牌照车在15这个时刻离去。
三、概要设计为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列这两个抽象数据类型。
1.栈抽象数据类型定义:ADT SqStack{数据对象:D={ai,bi,ci,di|ai∈int, bi∈int,ci∈int,di∈char),i =1,2...,n,n≥0}:数据关系:R={(ai,bi,di,)|ai,bi,di∈D,ai,bi,di∈struct car};基本操作:Car_enter(carnum,cartime).,n,n≥0};数据关系:R= ∅基本操作:Car_enter(carnum,cartime) 主程序流程及其模块调用关系:1)主程序流程:主函数提示用户输入指令:到达(‘A’,车牌号,时间);离去(‘D’,车牌号,时间);停车场‘P’显示停车场的车数;候车场‘W’显示候车场的车数;退出‘E’退出程序。
调用int Result(char carmove,int carnum,int cartime)根据输入信息完成车辆的离开或者达到。
若输入A则调用Car_enter(int carnum,int cartime) ,创建顺序栈CarS和链式队列CarQ,根据栈是否满决定输入的信息入栈还是入队列。
若栈未满,输入的车辆信息入栈,若已满,入队列。
若输入D则调用Car_Leave(int carnum,int cartime):创建一个临时栈存放退出让路的车,若在车库中找到对应的车,车库中该车后面的车辆信息进入临时栈CarS2,该车出栈,显示车牌号,此时时间,停留时间,应缴费用。
临时栈中的车的信息再回到CarS中。
此时若队列CarQ不为空则将队列中车辆信息放入栈CarS中。
若在车库中找不到对应的车的车牌号信息,则在表示候车场的队列中找该车信息,如果它在队列的最后,直接出列并输出车牌号,此时时间,停留时间,应缴费用。
如果它不在队尾,先把对应信息保存在一个指向队列的指针中,输出车牌号,此时时间,停留时间,应缴费用。
删除队列中此结点表示此车离开候车场。
若输入P,则输出车库车辆数PCar;若输入W,则输出候车场车辆数WCar;若输入E,则退出程序。
2)调用关系四、详细设计1.元素类型、结点类型和结点指针类型:typedef struct Node1 arnum=carnum;ime=cartime; PCar++;arnum,[].time,PCar);++;arnum){findcar=i;arnum=[].carnum;[].time=[].time;}printf("%d号车离开停车场! 离开时刻: %d,停留时长(%d)\n",[].carnum,cartime,[].time);PCar--;ime)*5);for(i=;i>=0;i--)arnum=[i].carnum;[].time=[i].time;++;;}if!=arnum=>carnum;ime=cartime;入一组数据进行测试:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
初始界面为:输入到达车辆:到达车辆超过车库容量时:输入车辆离开信息:输入P输入W:输入E:八、遇到的问题和解决方法1.开始,程序编写完成后虽然没有报错,却不能运行,如图经检查程序,将Stack *CarS; Queue *CarQ; 这两个指针型变量改成Stack CarS;arnum=>carnum;ime=cartime;算费用时发现错误,在候车厅时间也被计入停车费。
经检查程序,将[].time=>time;改成[].time=cartime;使其计费时间从进入车库开始而不是从达到候车场开始。
再次运行发现结果正确。
九、实验收货和感想这是第一次运用栈和队列的相关知识编写程序,开始看到这个题目感觉挑战很大,从未尝试过这么复杂的一个系统。
停车场问题相较与约瑟夫斯问题要复杂得多,分了多个模块。
起初编写时漏洞很多,好在当框架出来后各个漏洞都可以被弥补。
比如程序刚运行成功时,发现不能显示位置,车库车辆数和候车场车辆数不正确,计费不正确等很多漏洞,但这些细节的小问题都比较容易排查修改,最终终于做出了符合要求的停车场管理系统。
当完成后,我对栈和队列的相关算法的理解也更加清晰深刻了。
这个程序中还有一些灵活可变的地方,用宏定义定义了车库容量和费用单价,使具体数字可以较为灵活的改变,增加了这个程序的使用价值。
计算机实践课程给了我动手操作的机会,使我将理论和实际操作结合起来,更好地理解算法,更快地学会编程。
每次编程都感觉收获非常多。
练习的越多,对算法语句越是熟练,越能有深刻的理解,不仅帮助我更好的学习《软件技术基础》也为以后我们专业课的道路打好基石,对我们的逻辑能力也是很大的提升。
十、源程序#include<>#include<>#include <>#define MaxSize 2arnum=carnum;ime=cartime;PCar++;arnum,[].time,PCar);++;arnum){findcar=i;arnum=[].carnum;[].time=[].time;printf("%d号车离开停车场! 离开时刻: %d,停留时长(%d)\n",[].carnum,cartime,[].time);PCar--;ime)*5);for(i=;i>=0;i--)arnum=[i].carnum;[].time=[i].time;++;;}if!=arnum=>carnum;ime=cartime;//将此时的时刻记录入栈CarS,确保计算费用是从车辆从候车场进入车库后才开始算++;PCar++;//车库车辆数+1WCar--;//候车场车辆数-1p=;=>next;free(p);}}else//如果车库中找不到此车,再在候车场找{p=;if(p!=&&p->carnum!=carnum) //候车场队列不为空f=p->next;while(f!=&&f->carnum!=carnum){p=f;f=f->next;}if(f->carnum==carnum)//如果寻找的车在便道上,出队列{findcar=1;p->next=f->next;printf("%d号车离开候车场! 离开时间: %d,停留时长(%d)\n",f->carnum,cartime,cartime-f->time);WCar--;printf("应付停车费: %d\n",(cartime-f->time)*0);free(f);}}if(p->carnum==carnum)//要离开的车在队尾,直接出队{findcar=1;=>next;printf("%d号车离开候车场!离开时间: %d,停留时长(%d))!\n",p->carnum,cartime,cartime-p->time);WCar--;printf("应付停车费: %d\n",(cartime-p->time)*0);free(p);}}if(findcar==-1)printf("%d号车不在停车场中!\n",carnum);}int Result(char carmove,int carnum,int cartime)//根据输入信息完成车辆的离开或者达到{switch(carmove){case 'A':Car_enter(carnum,cartime);break;case 'D':Car_Leave(carnum,cartime);break;default :printf("输入错误!\n");break;}return 1;}main(){printf("试验名称:停车场管理问题\n");printf("学号:\n");printf("姓名:xx\n");printf("=========================================================\n");time_t rawtime1;struct tm * timeinfo1;time (&rawtime1);timeinfo1 = localtime (&rawtime1); //时间函数;printf ("程序运行开始,当前日期和时间: %s", asctime(timeinfo1));int go=1,carnum,cartime,MM;char carmove;=0;==(Node2 *)malloc(sizeof(Node2));while(go){printf("\n车辆到达请输入A;\n车辆离开请输入D;\n显示停车场内车数请输入P;\n显示候车场车数请输入W;\n退出程序请输入E:\n");printf("\n请输入信息:");carmove=getchar();printf("\n");switch(carmove){case 'A':{printf("%c\n车牌号:\t",carmove);scanf("%d",&carnum);printf("时间:\t");scanf("%d",&cartime);MM=Result(carmove,carnum,cartime);if(!MM)go=0;break;}case 'D':{printf("%c\n车牌号:\t",carmove);scanf("%d",&carnum);printf("现在时刻:\t");scanf("%d",&cartime);MM=Result(carmove,carnum,cartime);if(!MM)go=0;break;}case 'W':printf("正在外通道等待的车数量是: %d\n",WCar);break;case 'P':printf("车库内车的数量是: %d\n",PCar);break;case 'E':printf("退出!\n");time_t rawtime2;struct tm * timeinfo2;time (&rawtime2);timeinfo2 = localtime (&rawtime2);printf ("程序运行结束,当前日期和时间: %s", asctime(timeinfo2));return 0;}getchar();}}。