数据结构课程设计《停车场管理系统》_第1页
数据结构课程设计《停车场管理系统》_第2页
数据结构课程设计《停车场管理系统》_第3页
数据结构课程设计《停车场管理系统》_第4页
数据结构课程设计《停车场管理系统》_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构设计:停车场管理1 问题描述设停车场是一个可停放n 辆汽车的狭长通道, 且只有一个门可供出入。 汽车在停车场内按车辆到达时间的先后顺序, 依次由北向南排列 (门在最南端, 最先到达的第一辆车停放在车场的最北端) ,若车场内已停满n 辆汽车,则后来的汽车只能在门外的便道上等候, 一旦有车开走, 则排在便道上的第一辆汽车即可开入; 当停车场内某辆车要离开时, 在它之后进入的车辆必须先退出车场为它让路, 待该辆车开出大门外,其他车辆再按原顺序进入车场, 每辆停放在车场的车在它离开停车场时必须按它停留 的时间长短交纳费用。2 需求分析( 1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行

2、计时收费。( 2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车 场的调度功能。( 3)用顺序栈来表示停车场,链队表示停车场外的便道。( 4)显示停车场信息和便道信息。( 5)程序执行的命令为: 车辆进入停车场 车辆离开停车场 显示停车 场的信息。3 概要设计4 1 抽象数据类型定义( 1)栈的抽象数据类型定义AST Stack数据对象:D=ai|ai 6 ElemSet,i=1,2,,n, n >0数据关系:R1=<ai-1,ai>|ai-1,ai 6 D, i=2,n约定 an 端为栈顶, a1 端为栈底 。基本操作:InitStack(&S)操

3、作结果:构造一个空栈S。DestroyStack(&S)初始条件:栈S已存在。操作结果:栈S被销毁。ClearStack(&S)初始条件:栈S已存在。操作结果:将栈S 清为空栈。StackEmpty(S)初始条件:栈S 已存在。操作结果:若栈S 为空栈,则返回TRUE ,否则FALSE 。StackLength(s)初始条件:栈 S 已存在。操作结果:返回 S 的元素个数,既栈的长度。GetTop(S,&e)初始条件:栈S已存在且非空。操作结果:用e 返回S 的栈顶元素。Push(&S,e)初始条件:栈S已存在。操作结果:插入元素 e 为新的栈顶元素。Pop(&

4、amp;S,&e)初始条件:栈S 已存在且非空。操作结果:删除S的栈顶元素,并用e返回其值。StackTraverse(S,visit()初始条件:栈S 已存在且非空。操作结果: 从栈底到栈顶依次对S 的每个数据元素调用函数visit() 。 一旦 visit()失败,则操作失效。ADT Stack( 2)队列的抽象数据类型定义ADT Queue数据对象:D=ai|ai 6 ElemSet,i=1,2,,n,n>0数据关系:R1=<ai-1,ai>|ai-1,ai 6 D,i=2,n约定其中 a1 端为队列头, an 为队列尾。基本操作:InitQueue(&

5、Q)操作结果:构造一个空队列 Q 。DestroyQueue(&Q)初始条件:队列Q 已存在。操作结果:队列Q 被销毁,不再存在。ClearQueue(&Q)初始条件:队列Q 已存在。操作结果:将Q 清为空队列。QueueEmpty(Q)初始条件:队列 Q 已存在。操作结果:若Q 为空队列,则返回TRUE ,否则FALSE 。QueueLength(Q)初始条件:队列Q 已存在。操作结果:返回Q 的元素个数,即队列的长度。GetHead(Q,&e)初始条件: Q 为非空队列。操作结果:用 e 返回的队头元素。EnQueue(&Q,e)初始条件:队列 Q 已存在。

6、操作结果:插入元素 e 为 Q 的新的队尾元素。DeQueue(&Q,&e)初始条件: Q 为非空队列。操作结果:删除Q的队头元素,并用e返回其值。QueueTraverse(Q,visit()初始条件: Q 已存在且非空。操作结果:从队头到队尾,依次对Q 的每个数据元素调用函数visit() 。一旦visit() 失败,则操作失败。ADT Queue3 2 模块划分本程序包括六个模块:( 1)主程序模块void main()初始化停车站;初始化让路的临时栈;初始化通道;输出主菜单:车辆到达、车辆离开与计费、查看停车场信息;( 2)入场模块int arrive(SqStack

7、*In,LinkQueue *W)车辆进入停车场;计算停车费用( 3)出场模块void leave(SqStack *In,SqStack *Out,LinkQueue *W)车辆离开停车场;( 4)输出模块void info(SqStack S,LinkQueue W)输出停车场信息;( 5)栈模块 实现栈的抽象数据类型( 6)队列模块 实现队列的抽象数据类型124 详细设计4 1 数据类型的定义int MAX; /* 定义一个全局变量用来存储车库最大容量*/float price;/* 定义一个全局变量用来存储每车每小时的费用 */ typedef struct time int hour

8、;int min;Time; /* 时间结点 */ typedef struct node char num10;Time reach;Time leave;Car; /* 车辆信息结点 */typedef struct NODECar *stack100;int top;SqStack; /*停车站 */ typedef struct car Car *data;struct car *next;QNode;typedef struct Node QNode *head;QNode *rear;LinkQueue; /* 通道 */4 2 主要模块的算法描述本程序主要分为四部分: ( 1)主

9、函数及程序框架、( 2)车辆到达模块、( 3)车辆离开模块、( 4 )显示车辆信息模块,( 1)主函数void main()SqStack In,Out; LinkQueue Wait;int ch;InitStack(&In); /* 初始化停车站*/InitStack(&Out); /* 初始化让路的临时栈*/InitQueue(&Wait); /* 初始化通道 */while(1)printf(" 欢迎使用停车场管理系统n");printf("t 本系统由5011工作室开发,作者:邓春国、段庆龙、梁伟明、丁磊。 nn");p

10、rintf(" 请输入停车场的容量:");scanf("%d",&MAX);printf(" 请输入停车场的收费标准(元/小时 ):");scanf("%f",&price);printf("您输入的停车场容量为d位,费用为2.1f元/小时。n",MAX,price);printf("n (1)车辆到达n(2)车辆离开n(3)停车场信息n(4)退出系统n请选择 n");while(1)ch=getch();switch(ch)case 49:arrive(&a

11、mp;In,&Wait);break; /* 车辆到达 */case 50:leave(&In,&Out,&Wait);break; /* 车辆离开 */case 51:info(In,Wait);break; /*输出车站信息*/case 52:printf("谢谢使用! ");exit(0); /* 退出主程序 */ default:printf("n 按键无效,请重新按键选择! ");/*49 -52分别表示“1 ” -“4”这四个按键的键值*/system("CLS");printf("

12、; 欢迎使用停车场管理系统n");printf("t本系统由CG工作室开发,作者:邓春国、段庆龙、梁伟明、丁磊。 nnn");printf("您输入的停车场容量为 d位,费用为2.1f元/小时。n",MAX,price);printf("n (1)车辆到达n(2)车辆离开n(3)停车场信息n(4)退出系统 n请选择n");( 2)车辆离开模块算法分析void leave(SqStack *In,SqStack *Out,LinkQueue *W) /* 车辆离开 */int room;Car *p,*t;QNode *q;/

13、* 开始定义一个整型变量room, 用来记录要离开的车辆在停车场的位置, 定义车辆结点指针 p 和 t 和队列结点指针 q。 */if(In->top>0) /* 有车 */while(1) printf("n 请输入车在停车场的位置(1-%d) : ",In->top);scanf("%d",&room);if(room>=1&&room<=In->top) break;/* 判断停车场内是否有车,如果有车,就输入要离开的车辆在停车场的位置,否则就提示停车场没车。这里用了 while 循环语句

14、,如果输入的车辆位置超出范围,就要重新输入。 */while(In->top>room) /* 车辆离开 */ Out->top+;Out->stackOut->top=In->stackIn->top; In->stackIn->top=NULL;In->top-;/*如果栈顶位置In->top大于要离开的车位置room(即要离开的车不在停车场 的门口) 的话, 在要离开的车辆前面的车就要先离开, 开到临时停车场, 即临时栈中, 因此Out所表示的临时栈的栈顶top力口1,用来表示临时停车场增加1辆车;接着 把该车的信息拷贝到

15、栈Out 中,然后删除栈In 的栈顶(即这辆车开走) 。 */p=In->stackIn->top;In->stackIn->top=NULL;In->top-;while(Out->top>=1) In->top+;In->stackIn->top=Out->stackOut->top; Out->stackOut->top=NULL; Out->top-;/* 直到要离开的车辆前面的车都开到临时停车场之后,该车才离开,离开之后,该车的信息结点 In->stackIn->top 置空,然后栈

16、顶In->top 减 1。 之后就判断临时停车场是否有车, 有车就一辆一辆的开回停车场里面, 因此停车场的栈顶In->top 加1 ,然后就把临时停车场的车结点的信息拷贝到停车场的车结点上,接着删除临时停车场车的结点(即 Out->stackOut->top=NULL;Out->top-; ) 。 */PRINT(p,room);if(W->head!=W->rear)&&In->top<MAX)q=W->head->next;t=q->data;In->top+;printf("n便道的$

17、号车进入车场第d号停车位。",t->num,In->top);printf("n 请输入现在的时间(格式“ *:* ” ):");scanf("%d:%d",&(t->reach.hour),&(t->reach.min);W->head->next=q->next;if(q=W->rear) W->rear=W->head;In->stackIn->top=t;free(q);/* 判断 (W->head!=W->rear)&&

18、In->top<MAX (即通道上是否有车及停车场是否已满) ,如果便道有车且停车场未满,通道的车便可进入停车场,此时指针 q 指向便道的头,即队头,然后停车场的栈顶 In->top 加 1 以便增加新的车辆,接着输入队头的车辆信息,即要进去停车场的车的信息,然后便道队列的头结点指向q (即刚进入停车场的车的结点) 的后继结点, 即原队列中第二辆车的结点, 接着判断刚离开的车是否是最后一辆车,如果是,就把队列置空,即队头等于队尾;之后就把结点t (即要进入停车场的车)的信息拷贝到停车场栈顶的车中,最后释放p的空间,即原队头结点。 */else printf("n 停

19、车场里没有车n"); /* 没车 */printf("请按任意键返回");getch();5测试分析测试数据及结果如下:输入2辆车的信息,如图5.2所示:再输入2辆车的信息,如图最后选择车辆离开,输入第 2辆车离开,如图请选择停车场甘珅程.序进车场所在的停车位为车牌号进车场时刻:出车场时刻:停留时间,CAUsers Adm nii-trat?r.PC-20141024YLPr Des let g pDeb dgC16课程设计总结通过这次课程设计使我充分的理解了用栈和队列实现模拟停车场的基本原理,知道了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会

20、了编写停车场问题的程序。虽然此次的程序不是很完备,没有加入一些更完善的功能,但是 总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。在刚开始编程的时候,我感到有点无从下手,但经过对题目的详细分析和思 考之后,我就知道具体应该做什么,怎么做了。经过几天和同学的一起研究,我完成 这个程序,我学到了很多东西,这是在课堂上无法做到的。源程序#include<stdio.h>#include <stdlib.h>#include<iostream.h>#include<string.h>#include<math.h&

21、gt;#define size 1/ 停车场位置数/模拟停车场的堆栈的性质;typedef struct zanlindint number;/汽车车号int ar_time;/ 汽车到达时间zanInode;typedef structzanInode *base; /停车场的堆栈底zanInode *top; /停车场的堆栈顶int stacksize_curren;stackhead;/堆栈的基本操作;void initstack(stackhead &L)/构造一个空栈L.base=(zanInode*)malloc(size*sizeof(zanlind);if(!L.bas

22、e) exit(0);L.top=L.base;L.stacksize_curren=0;void push(stackhead &L,zanInode e) / 把元素 e 压入 s 栈*L.top+=e;L.stacksize_curren+;void pop(stackhead &L,zanInode &e)/把元素 e 弹出 s 栈if(L.top=L.base)cout<<" 停车场为空!"return;e=*-L.top;L.stacksize_curren-;/模拟便道的队列的性质;typedef struct duilie

23、int number;/汽车车号int ar_time;/汽车到达时间struct duilie *next;*queueptr;typedef structqueueptr front;/便道的队列的对头queueptr rear;/便道的队列的队尾int length;linkqueue;/队列的基本操作;void initqueue(linkqueue &q) / 构造一个空队列 q.front=q.rear=(queueptr)malloc(sizeof(duilie);if(!q.front|!q.rear)exit(0);q.front->next=NULL;q.le

24、ngth=0;void enqueue(linkqueue &q,int number,int ar_time) / 把元素的插入队列(属性为 number , ar_time ) queueptr p;p=(queueptr)malloc(sizeof(duilie);if(!p) exit(0);p->number=number;p->ar_time=ar_time;p->next=NULL;q.rear->next=p;q.rear=p;q.length+;void popqueue(linkqueue &q,queueptr &w) /

25、把元素的插入队列(属性为number, ar_time )queueptr p;if(q.front=q.rear)cout<<" 停车场的通道为空! !"<<endl;return;p=q.front->next;w=p;q.front->next=p->next;q.length-;if(q.rear=p) q.front=q.rear;void jinru(stackhead &st,linkqueue &q)/对进入停车场的汽车的处理;int number,time_a;cout<<"

26、车牌为: "cin>>number;cout<<" 进场的时刻 :"cin>>time_a;if(st.stacksize_curren<2)zanInode e;e.number=number;e.ar_time=time_a;push(st,e);cout<< " 该车已进入停车场在 : "<<st.stacksize_curren<<" 号车道 "<<endl<<endl;elseenqueue(q,number,ti

27、me_a);cout<<" 停车场已满,该车先停在便道的第"<<q.length<<" 个位置上 "<<endl;void likai(stackhead &st,stackhead &sl,linkqueue &q) / 对离开的汽车的处理;/st 堆栈为停车场, sl 堆栈为倒车场int number,time_d,flag=1,money,arrivaltime; /q 为便道队列cout<<" 车牌为: "cin>>number;c

28、out<<" 出场的时刻: "cin>>time_d;zanInode e,q_to_s;queueptr w;while(flag)/找到要开出的车,并弹出停车场栈pop(st,e);push(sl,e);if(e.number=number)flag=0;money=(time_d-e.ar_time)*2;arrivaltime=e.ar_time;pop(sl,e);/把临时堆栈的第一辆车(要离开的)去掉;while(sl.stacksize_curren) / 把倒车场的车倒回停车场pop(sl,e);push(st,e);if(st.st

29、acksize_curren<2&&q.length!=0) / 停车场有空位,便道上的车开进入停车场(popqueue(q,w);q_to_s.ar_time=time_d;q_to_s.number=w->number;push(st,q_to_s);cout<<"车牌为"<<q_to_s.number<<"的车 已从通道进入停车场,所在 的停车位 为:"<<st.stacksize_curren<<endl<<endl;cout<<"n收 据"<<endl;cout<<"= 车牌号:"<<number<<endl;cout<<"="<<endl;cout<<"|进车场时刻|出车场时刻|停留时间|应付(元)|"<<endl;c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论