资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1实验二:停车场管理问题一、 问题描述1、实验题目:设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车停在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端) 。若停车场内已经停满 n 辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可进入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原来的次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。2、基本要求:为停车场编制按上述要求进行管理的模拟程序。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、本程序是模拟现实生活中的停车场管理系统,有较强的实用性,及较高的可靠性。2、该程序具有友好的用户界面,操作多样,管理方面。3、用户根据提示选择相应的操作,并根据提示输入每辆车的信息。三、概要设计1、停车场的管理流程分析:当车辆进入停车场时,首先检查停车场是否已满,若未满,车辆进入停车场,若已满,车辆进入便道等候。2当车辆要求离开时,先让在它之后进入的车辆退出停车场为它让路,再让该车退出停车场,之后,让路的所有车辆再按其原来进入停车场的次序进入停车场。再检查便道上是否还有车等候,有车则让最先等候的那辆车进入停车场。2、数据结构分析由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后的车辆必须先退出停车场为它让路,先进停车场的后退出,符合“先进后出”的特点,所以用一个栈来模拟停车场。当停车场满了后,后来的车辆都要到便道上等候,先排队的车辆先离开便道进入停车场,符合队列的“先进先出”的特点,所以用一个队列来模拟便道。由于停车场中的车辆可以随时离开,当车辆要离开时,在它后面的车辆都要先退出停车场,所以要再设置一个辅助栈来模拟车辆退出停车场。综上所述,求解本题用到了两个栈和一个队列。栈以顺序结构模拟,队列一链式结构模拟。抽象数据类型的定义#define Parking struct parkingADT Parking数据对象:D= | Parking, i=1,2,3. ia数据关系:R= ADT Parking;#define Assistant struct assistantADT Assistant数据对象:D= | Assistant, i=1,2,3. ia数据关系:R= ADT Assistant;#define Qnode struct qnode3ADT Qnode数据对象:D= | Qnode, i=1,2,3. ia数据关系:R= ADT Qnode;#define LinkQueue struct linkqueueADT LinkQnode数据对象:D= | LinkQnode, i=1,2,3. ia数据关系:R= ADT LinkNode;自定义函数void Print_Parking(Parking *p)/打印停车场中所停的车辆信息for()couttop;i+)coutcar_numitimeitop+;p-car_nump-top=c;p-timep-top=t;couttop+1car_num=c;q-time=t;q-station=L-rear-station+1;coutstationnext=NULL;L-rear-next=q;L-rear=q;10void Take_Out(Parking *p,Assistant *a,int c,int t)/车要离开停车场int i, m=0;while(p-car_numm!=c)m+; while(m=MaxSize)coutc;m=0;while(p-car_numm!=c)m+; while(ttimem)coutt;couttimemtimemtop)for(i=p-top;itop+;a-car_numa-top=p-car_numi;a-timea-top=p-timei; /*将离开车辆之后的车辆移入 Assistant 栈*/for(i=a-top;icar_numm=a-car_numi;/*车辆离开后,将 Assistant 栈中的车辆依次移入停车场中*/p-timem=a-timei;m+;a-top=-1;p-top-;void LinkQueue_to_Parking(LinkQueue *L,Parking *p,int t)/*便道上的车进入停车场*/p-top+;p-car_nump-top=L-front-next-car_num;11p-timep-top=t;L-front=L-front-next;/q;L-rear-station-;void Operate(Parking *p,Assistant *a,LinkQueue *L)/对停车场程序的操作char ch;int c,t;coutch;switch(ch)case E:/退出程序break;case A: coutc;coutt;if(p-top+1!=MaxSize) /停车场未满,存储车辆 In_Parking(p,c,t);coutrear-station=0)if(p-top=-1)coutc;12coutt;Take_Out(p,a,c,t);coutc;coutt;Take_Out(p,a,c,t);couttop+1top+1)rear-stationtop=-1; /初始化停车场a=(Assistant *)malloc(sizeof(Assistant);a-top=-1; /初始化辅助栈qq=(Qnode *)malloc(sizeof(Qnode);qq-station=0;qq-next=NULL; /初始化链队结点L=(LinkQueue *)malloc(sizeof(LinkQueue);L-front=qq;L-rear=qq;/初始化链队cout#include#include#define Parking struct parking#define Assistant struct assistant#define Qnode struct qnode#define LinkQueue struct linkqueue#define MaxSize 2 /停车场最大容量void Print_Parking(Parking *p);/打印停车场中所停的车辆信息void In_Parking(Parking *p,int c,int t);/进入停车场void In_LinkQueue(LinkQueue *L,int c,int t);/进入便道void Take_Out(Parking *p,Assistant *a,int c,int t);/车要离开停车场void LinkQueue_to_Parking(LinkQueue *L,Parking *p,int t);/便道上的车进入停车场void Operate(Parking *p,Assistant *a,LinkQueue *L);/对停车场程序的操作Parking/*停车场用顺序栈来模拟,存放停车的车牌号,进入停车场的时间*/int car_numMaxSize;int timeMaxSize;int top; Assistant/*辅助栈,用于存放退出停车场的车辆信息*/int car_numMaxSize;int timeMaxSize;int top; Qnode/链队的结点类型int car_num;int time;int station;Qnode *next; LinkQueue/将头尾指针封装在一起 Qnode *front,*rear; ;int main()Parking *p;Assistant *a;Qnode *qq;17LinkQueue *L;p=(Parking *)malloc(sizeof(Parking);p-top=-1; /初始化停车场a=(Assistant *)malloc(sizeof(Assistant);a-top=-1; /初始化辅助栈qq=(Qnode *)malloc(sizeof(Qnode);qq-station=0;qq-next=NULL; /初始化链队结点L=(LinkQueue *)malloc(sizeof(LinkQueue);L-front=qq;L-rear=qq;/初始化链队couttop;i+)coutcar_numitimeitop+;p-car_nump-top=c;p-timep-top=t;couttop+1car_num=c;q-time=t;q-station=L-rear-station+1;18coutstationnext=NULL;L-rear-next=q;L-rear=q;void Take_Out(Parking *p,Assistant *a,int c,int t)/车要离开停车场int i, m=0;while(p-car_numm!=c)m+; while(m=MaxSize)coutc;m=0;while(p-car_numm!=c)m+; while(ttimem)coutt;couttimemtimemtop)for(i=p-top;itop+;a-car_numa-top=p-car_numi;a-timea-top=p-timei; /*将离开车辆之后的车辆移入 Assistant 栈*/for(i=a-top;icar_numm=a-car_numi;/*车辆离开后,将 Assistant 栈中的车辆依次移入停车场中*/p-timem=a-timei;m+;a-top=-1;19p-top-;void LinkQueue_to_Parking(LinkQueue *L,Parking *p,int t)/*便道上的车进入停车场*/p-top+;p-car_nump-top=L-fr
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号