1目录1、设计内容与要求……………………1.1设计内容描述…………………………1.2设计基本要求………………………………2、需求分析及程序分析………………2.1需求分析……………………………………2.2算法的设计分析…………………………2.3时间复杂度的分析…………………………2.4设计原理框图…………………………3、详细设计…………………………4、运行结果…………………………5、课程设计的总结……………………附录……………………………………………………2停车场管理系统1、设计内容与要求1.1设计内容描述设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。试用停车场编制按上述要求进行管理的模拟程序。1.2设计基本要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息,汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。2、需求分析及程序分析32.1需求分析a、根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费b、当有车辆从停车场离开时,等待的车辆按顺序进入停车场存放,实现停车的调度功能。c、用顺序栈来表示停车场,链队表示停车场外的便道。d、显示停车场信息和便道信息。e、程序的执行命令为:(1)车辆进入停车场(2)车辆离开停车场(3)显示停车场的信息2.2算法的设计分析由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,又每个汽车的车牌号都不一样,这样一来可以根据车牌号准确找到汽车位置,所以堆栈里的数据元素我设计成汽车的车牌号。当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车车牌号。当停车场4满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间,车辆离开停车场时的时间不需要记录,当从终端输入时可直接使用。由于时间不象汽车一样需要让道,我设计了一个顺序表来存放时间。又用顺序表用派生法设计了一个堆栈,恰好满足上面模拟停车场的需要。2.3时间复杂度的分析(说明:对时间复杂度的分析,均指在最坏情况下的时间复杂度。)在栈结构中:(1)初始化栈(即车库),使车库为空的,此时,时间复杂度=O(max)。(2)停车最坏的情况是要车位已经满,此时,时时间复杂度=O(1)。(3)关于车辆离开的时间复杂度=O(max)。(4)车场信息的显示的时间复杂度=O(1)。在队列结构中:5(1)出场车的信息的时间复杂度=O(1)。(2)判断通道上是否有车及车站是否已满,此时,时间复杂度O=(max)。(3)车辆停车费用的时间复杂度O=(1)2.4设计原理框图车辆到达以堆栈来模拟停车场和以堆栈里的数据元素我设计成汽车的车牌号初始化车站,初始化让路的临时栈,初始化通道车场未满,车进车场车场已满,车进便道判断车场是否已满车输入车子到达时间,车牌号未满输入离开车辆的离开时间,进行停车费用的计算不做任何计算判断车场内是否有车有无点x车进入车场此车后面的车辆退出并进入临时栈63、详细设计程序中所采用的数据结构及存储结构的说明Time-建立时间结点:typedefstructtime{inthour;intmin;}Time;CarNode-建立车辆信息结点:typedefstructnode{charnum[10];Timereach;Timeleave;}CarNode;“栈”的定义可知,每一次入栈的元素都在原栈顶元素之上成为新的元素,每一次出栈的元素总是当前栈顶元素使次栈元素成为新的栈顶元素,即最后进栈者先出栈。程序中采用的结构是:typedefstructnode{CarNode*stack[MAX+1];车子离开7inttop;}SeqStackCar;/*模拟车库*/“队列”是限定所有插入操作只能在表的一端进行,而所有的删除操作都只能在表的另一端进行。插入端叫队尾,删除端叫对头。按先进先出规则进行。程序中采用的结构是:typedefstructNode{QueueNode*head;QueueNode*rear;}LinkQueueCar;/*模拟通道*/typedefstructcar{CarNode*data;structcar*next;}QueueNode;栈描述(1)、在SeqStackCar中定义创建一个栈CarNode*stack[MAX+1];inttop;(2)、SeqStackCarEnter,TempInitStack(&Temp)在车辆离开时,应用temp临时把将要离开的车辆后续车辆压入,等车辆离开后压回原栈stackvoidLeave(SeqStackCar*Enter,SeqStackCar8*Temp,LinkQueueCar*W)函数描述(1)、intArrival(SeqStackCar*Enter,LinkQueueCar*W){(2)、intInitQueue(LinkQueueCar*Q){(3)、voidInitStack(SeqStackCar*s){(4)、voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)(5)、voidList(SeqStackCarS,LinkQueueCarW)(6)、voidList1(SeqStackCar*S)(7)、voidList2(LinkQueueCar*W)(8)、voidPRINT(CarNode*p,introom)4、运行结果车辆进入车场:车场已满:9车辆离开,并收费:列出车场信息:列出车道信息:5、课程设计的总结通过这次课程设计使我们小组充分了解了利用栈和队列模拟停车场系统的基本原理,知道了它们存储结构及其相关操作的程序实现。虽然不是很完备,没有加入一些更完善的功能使我懂得了理论与实际相结合是很重要的,却让我们10明白只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立。在此感谢我们的指导老师,是他细心认真的指导,让我们掌握的更好,懂得得更多。11附录#includestdio.h#includestdlib.h#includestring.h/*------------------------------------------------------------------------------*/#defineMAX3/*车库容量*/#defineprice0.05/*每车每分钟费用*/typedefstructtime{inthour;intmin;}Time;/*时间结点*/typedefstructnode{charnum[10];Timereach;Timeleave;}CarNode;/*车辆信息结点*/typedefstructNODE{CarNode*stack[MAX+1];inttop;}SeqStackCar;/*模拟车场*/typedefstructcar{CarNode*data;structcar*next;}QueueNode;typedefstructNode{QueueNode*head;QueueNode*rear;}LinkQueueCar;/*模拟通道*//*------------------------------------------------------------------------------*/12voidInitStack(SeqStackCar*);/*初始化栈*/intInitQueue(LinkQueueCar*);/*初始化便道*/intArrival(SeqStackCar*,LinkQueueCar*);/*车辆到达*/voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);/*车辆离开*/voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*//*------------------------------------------------------------------------------*/voidmain(){SeqStackCarEnter,Temp;LinkQueueCarWait;intch;InitStack(&Enter);/*初始化车站*/InitStack(&Temp);/*初始化让路的临时栈*/InitQueue(&Wait);/*初始化通道*/while(1){printf(\n1.车辆到达);printf(2.车辆离开);printf(3.列表显示);printf(4.退出系统);while(1){scanf(%d,&ch);if(ch=1&&ch=4)break;elseprintf(\npleasechoose:1|2|3|4.);}switch(ch){case1:Arrival(&Enter,&Wait);break;/*车辆到达*/case2:Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/13case3:List(Enter,Wait);break;/*列表打印信息*/case4:exit(0);/*退出主程序*/default:break;}}}/*------------------------------------------------------------------------------*/voidInitStack(SeqStackCar*s)/*初始化栈*/{inti;s-top=0;for(i=0;i=MAX;i++)s-stack[s-top]=NULL;}intInitQueue(LinkQueueCar*Q)/*初始化便道*/{Q-head=(QueueNode*)malloc(sizeof(QueueNode));if(Q-head!=NULL){Q-head-next=NULL;Q-rear=Q-head;return(1);}elsereturn(-1);}voidPRINT(CarNode*p,introom)/*打印出场车的信息*/{intA1,A2,B1,B2;printf(\n请输入离开的时间:/**:**/);scanf(%d:%d,&(p-leave.hour),&(p-leave.min));14printf(\n离开车辆的车牌号为:);puts(p-num);printf(\n其到达时间为:%d:%d,p-reach.ho