1、 实验二:停车场管理问题一、 问题描述1、实验题目:设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车停在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端) 。若停车场内已经停满 n 辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可进入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原来的次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。2、基本要求:为停车场编制按上述要求进行管理的模拟程序。3、测
2、试数据:设 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、面。3、用户根据提示选择相应的操作,并根据提示输入每辆车的信息。三、概要设计1、停车场的管理流程分析:当车辆进入停车场时,首先检查停车场是否已满,若未满,车辆进入停车场,若已满,车辆进入便道等候。当车辆要求离开时,先让在它之后进入的车辆退出停车场为它让路,再让该车退出停车场,之后,让路的所有车辆再按其原来进入停车场的次序进入停车场。再检查便道上是否还有车等候,有车则让最先等候的那辆车进入停车场。2、数据结构分析由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后的车辆必须先退出停车场为它让路,先进停车场的后退出,符合“先进后出”的特点,所以用一个栈来模拟停车场。当停车场满了后,后来的车辆
4、都要到便道上等候,先排队的车辆先离开便道进入停车场,符合队列的“先进先出”的特点,所以用一个队列来模拟便道。由于停车场中的车辆可以随时离开,当车辆要离开时,在它后面的车辆都要先退出停车场,所以要再设置一个辅助栈来模拟车辆退出停车场。综上所述,求解本题用到了两个栈和一个队列。栈以顺序结构模拟,队列一链式结构模拟。抽象数据类型的定义#define Parking struct parkingADT Parking数据对象:D= | Parking, i=1,2,3 ia数据关系:R= ADT Parking;#define Assistant struct assistantADT Assista
5、nt数据对象:D= | Assistant, i=1,2,3 ia数据关系:R= ADT Assistant;#define Qnode struct qnodeADT 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+)c
6、outcar_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;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(
7、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-t
8、op+;p-car_nump-top=L-front-next-car_num;p-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-
9、top=-1)coutc;coutt;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;/初始化链
10、队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,i
11、nt 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/*辅助栈,用于存
12、放退出停车场的车辆信息*/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;LinkQueue *L;p=(Parking *)malloc(sizeof(Parking);p-top=-1; /初始化停车场a=(Assistant *)malloc(sizeof(Ass
13、istant);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;coutstationnext=NULL;
14、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(
15、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;p-timep-top=t;L-front=L-front-next;/q;L-rear-station-;void Operate(Parking *p,Assistant
16、*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;coutt;Take_Out(p,a,c,t);coutc;coutt;Take_Out(p,a,c,t);couttop+1top+1)rear-station#include#include#define Parking st
17、ruct 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);/进入便道int FindCar_LinkQueue(LinkQu
18、eue *L,int c);/查找所要取出的车牌号是否在便道int FindCar_Parking(Parking *p,int c);/查找所要取出的车牌号是否在停车场中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
19、;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;LinkQueue *L;p=(Parking *)
20、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;cout
21、top+1car_num=c;q-time=t;q-station=L-rear-station+1;coutstationnext=NULL;L-rear-next=q;L-rear=q;int FindCar_LinkQueue(LinkQueue *L,int c)/查找所要取出的车牌号是否在便道int n=0;Qnode *s;s=L-front-next;if(L-rear-station!=0)while(s-car_num!=c) n+;if(s=L-rear)break;s=s-next;elsen=-1;/n=-1 表示,便道是空的return n; int FindCar_
22、Parking(Parking *p,int c)/查找所要取出的车牌号是否在停车场中int m=0;while(p-car_numm!=c)m+; if(m=MaxSize)m=-1;/m=-1 表示停车场中没有该车牌号return m;void Take_Out(Parking *p,Assistant *a,LinkQueue *L,int c,int t)int i,m,n;Qnode *s;s=L-front;m=FindCar_Parking(p,c);n=FindCar_LinkQueue(L,c);while(m=-1m=FindCar_Parking(p,c);n=FindC
23、ar_LinkQueue(L,c);if(m=-1irear-station-1;i+)s=s-next;L-rear=s;L-rear-next=NULL;else/若所取出的车牌号不是队列尾指针时,尾指针不动,只需将其车位号减 1for(i=0;inext;s-next=s-next-next;L-rear-station-;else/表示所要取出的车牌号在停车场中while(ttimem)/表示时间输入有误coutt;if(m!=-1itop+;a-car_numa-top=p-car_numi;a-timea-top=p-timei; /将离开车辆之后的车辆移入Assistant 栈f
24、or(i=a-top;icar_numm=a-car_numi; /车辆离开后,将 Assistant 栈中的车辆依次移入停车场中p-timem=a-timei;m+;a-top=-1; /此时要清空辅助栈else/表示要退出的车辆恰好位于停车场的最后一个,这时不需要利用辅助栈couttimemtimemtop-;if(n!=-1)/表示如果便道不为空,而且停车场有空位时,要让便道上的车辆进站couttop+;p-car_nump-top=L-front-next-car_num;p-timep-top=t;if(L-rear-station=1)/如果便道上的车辆只有一辆,当这辆车进入停车场
25、时,要修改尾指针L-rear-station=0;L-rear=L-front;L-rear-next=NULL;else/这时尾指针不用修改,只需修改头指针L-front=L-front-next;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);couttop=-1)coutc;coutt;Take_Out(p,a,L,c,t);couttop+1top+1)rear-station“ 辆车!“endl;Operate(p,a,L);break;default: