《数据构造停车场问题实验报告汇总.docx》由会员分享,可在线阅读,更多相关《数据构造停车场问题实验报告汇总.docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据构造停车场问题实验报告汇总当前位置:文档视界数据构造停车场问题实验报告汇总数据构造停车场问题实验报告汇总一、问题描绘设有一个能够停放n辆汽车的狭长停车场,它只要一个大门能够供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。假如停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。假
2、如停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。二、实现要求要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。三、实现提示汽车的模拟输入信息格式能够是:(到达离去,汽车牌照号码,到达离去的时刻)。例如,(A,1,5)表示1号牌照车在5这个时刻到达,而(D,5,20)表示5号牌照车在20这个时刻离去。整个程序能够在输入信息为(E,0,0)时结束。此题可用栈和队列来实现。四、需求分析停车场采用栈式构造,停车场外的便道采用队列构造即使道就是等候队列。停车场
3、的管理流程如下当车辆要进入停车场时,检查停车场能否已满,假如未满则车辆进栈车辆进入停车场;假如停车场已满,则车辆进入等候队列车辆进入便道等候。当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈在它之后进入的车辆必须先退出车场为它让路,再让该车出栈,其他车辆再按原次序进栈进入车场。当车辆出栈完毕后,检查等候队列便道中能否有车,有车则从队列头取出一辆车压入栈中。当前位置:文档视界数据构造停车场问题实验报告汇总数据构造停车场问题实验报告汇总六、具体设计1.本程序主要包含四个模块1)主程序模块intmain()Initialization();CarNodecar;SqStackPark,TempPark
4、;LinkQueueQ;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)caseA:casea:Arrive(Park,Q,car);break;caseD:cased:Leave(Park,TempPark,Q,car);break;default:printf(您的第一个数据输入有误!n);break;printf
5、(程序结束,谢谢使用!n);return0;2分别构造空栈和空队列栈:StatusInitStack(SqStack&S)/构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc(MAX)*sizeof(CarNode);exit(OVERFLOW);printf(存储空间分配失败);S.top=S.base;returnOK;队列:StatusInitQueue(LinkQueue&Q)/构造一个空队列带头结点Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode);if(!Q.front)exit(OVERFLO
6、W);printf(存储空间分配失败);Q.front-next=NULL;Q.queuesize=0;returnOK;3车辆到达处理StatusArrive(SqStack&S,LinkQueue&Q,CarNode&e)/车辆到达处理if(S.top-1)-timeprintf(该牌照的车已存在,输入有误,请重新输入n);returnOK;elseprintf(时间输入有误,请重新输入!n);returnFALSE;4车辆离开处理StatusLeave(SqStack&S,SqStack&TempS,LinkQueue&Q,CarNode&e)/车辆离开处理CarNodea;intlea
7、time,leanum;intentertime;/进入停车场时间intcost;if(!(Check_Stack(S,e)|Check_Queue(Q,e)printf(数据输入错误,本停车场内无所查询车辆,请重新输入!n);returntrue;elseif(Check_Stack(S,e)/若需要离开的车辆在停车场if(e.num=(S.top-1)-num)/车辆处在栈顶Pop(S,a);leatime=e.time;leanum=e.num;entertime=a.time;printf(车辆进入车库时间:%dt如今离开时间:%dt停留时间:%dtn,entertime,leatim
8、e,leatime-entertime);else/车辆处在栈中间doPop(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(车进入停车场时间:%dt如今离开时间:%dt停留时间:%dtn,entertime,leatime,leatime-entertime);do/其余车辆按原来次序返回停车场Pop(TempS,a);Push(S,a);whi
9、le(TempS.top!=TempS.base);/条件与上面不同,此时是全部回去cost=(leatime-entertime)*price;if(cost=0)printf(您的车牌号为%d的车应交纳的费用是:%dn,leanum,cost);if(Q.front!=Q.rear)/队列不空的话从便道进停车场DeQueue(Q,a);if(a.time为:%dn,a.num,S.top-S.base,a.time);elseif(Check_Queue(Q,e)/从便道直接离开doDeQueue(Q,a);EnQueue(Q,a);while(Q.front-next-data.num!
10、=e.num);DeQueue(Q,e);/前面的车进入队尾printf(您的车牌号为%d的车辆未进入车库从便道直接离开,费用为0!n,e.num);returntrue;2主要设计程序如下#include#include#include#defineMAX2/停车场容量#defineprice2/单价#defineOK1#defineFALSE0#defineTRUE1#defineERROR-1#defineOVERFLOW-2typedefintStatus;/=typedefstructCarNodeintnum;inttime;CarNode;/车辆信息结点typedefstruct
11、SqStackCarNode*base;CarNode*top;intStacksize;SqStack;/栈停车场typedefstructQNodeCarNodedata;structQNode*next;QueueNode;/便道结点typedefstructLinkQueueQueueNode*front;QueueNode*rear;intqueuesize;LinkQueue;/队列便道/=StatusInitStack(SqStack&S)/构造一个空栈S.Stacksize=0;S.base=(CarNode*)malloc(MAX)*sizeof(CarNode);if(!S
12、.base)exit(OVERFLOW);printf(存储空间分配失败);S.top=S.base;/=StatusInitQueue(LinkQueue&Q)/构造一个空队列带头结点Q.front=Q.rear=(QueueNode*)malloc(sizeof(QueueNode);if(!Q.front)exit(OVERFLOW);printf(存储空间分配失败);Q.front-next=NULL;Q.queuesize=0;returnOK;/=StatusGetTop(SqStackS,CarNode&e)/返回栈顶元素if(S.top=S.base)returnERROR;e
13、=*(S.top-1);returnTRUE;/=StatusPop(SqStack&S,CarNode&e)/删除栈顶元素if(S.top=S.base)returnERROR;e=*-S.top;returnOK;/=StatusPush(SqStack&S,CarNodee)/插入元素为新的栈顶元素(在栈不满的前提下)if(S.top-S.base=MAX)returnFALSE;*S.top+=e;returnOK;/=StatusDeQueue(LinkQueue&Q,CarNode&e)/删除队头元素(带头结点)if(Q.rear=Q.front)returnERROR;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-;returnOK;/=StatusEnQueue(LinkQueue&Q,CarNodee)/插入新的队尾元素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+;returnOK;/=
限制150内