版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构设计:停车场管理姓名:韦邦权专业:2013 级计算机科学与技术学号:13224624班级:13052316完成日期: 1 问题描述设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个门可供出入。汽车在 停车场按车辆到达时间的先后顺序, 依次由北向南排列 (门在最南端, 最先到达的第 一辆车停放在车场的最北端) ,若车场已停满 n 辆汽车,则后来的汽车只能在门外的 便道上等候,一旦有车开走, 则排在便道上的第一辆汽车即可开入; 当停车场某辆车 要离开时, 在它之后进入的车辆必须先退出车场为它让路, 待该辆车开出大门外, 其 他车辆再按原顺序进入车场, 每辆停放在车场的车在它离开停车场时
2、必须按它停留的 时间长短交纳费用。2 需求分析(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。( 2 )当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车 场的调度功能。(3)用顺序栈来表示停车场,链队表示停车场外的便道。(4)显示停车场信息和便道信息。(5)程序执行的命令为:(1车辆进入停车场(!车辆离开停车场 ©显示停车场 的信息。3 概要设计31 抽象数据类型定义( 1)栈的抽象数据类型定义AST Stack数据对象:D=ai|ai ElemSet,i=1,2,n, n> 0数据关系:R1=<ai-1,ai>|ai-1,ai
3、D, i=2,n约定 an 端为栈顶, a1 端为栈底 。基本操作:InitStack(&S)操作结果:构造一个空栈 S。DestroyStack(&S)初始条件:栈 S 已存在。操作结果:栈 S 被销毁。ClearStack(&S)初始条件:栈 S 已存在。 操作结果:将栈 S 清为空栈。StackEmpty(S)初始条件:栈 S 已存在。操作结果:若栈S为空栈,则返回TRUE,否则FALSE。StackLength(s)初始条件 :栈 S 已存在。操作结果:返回 S 的元素个数,既栈的长度。GetTop(S,&e)初始条件:栈 S 已存在且非空。操作结果:用
4、 e 返回 S 的栈顶元素。Push(&S,e)初始条件:栈 S 已存在。 操作结果:插入元素 e 为新的栈顶元素。Pop(&S,&e)初始条件:栈 S 已存在且非空。操作结果:删除S的栈顶元素,并用e返回其值。StackTraverse(S,visit() 初始条件:栈 S 已存在且非空。操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit() 失败,则操作失效。ADT Stack (2)队列的抽象数据类型定义 ADT Queue数据对象:D=ai|ai ElemSet,i=1,2,,n,n> 0数据关系:R1=<ai-1,a
5、i>|ai-1,ai D,i=2,n约定其中 a1 端为队列头, an 为队列尾。基本操作:InitQueue(&Q) 操作结果:构造一个空队列 Q 。 DestroyQueue(&Q) 初始条件:队列 Q 已存在。 操作结果:队列 Q 被销毁,不再存在。ClearQueue(&Q) 初始条件:队列 Q 已存在。 操作结果:将 Q 清为空队列。QueueEmpty(Q) 初始条件:队列 Q 已存在。操作结果:若Q为空队列,则返回TRUE,否则FALSE。QueueLength(Q)初始条件:队列 Q 已存在。操作结果:返回 Q 的元素个数,即队列的长度。GetHe
6、ad(Q,&e)初始条件: Q 为非空队列。 操作结果:用 e 返回的队头元素。EnQueue(&Q,e) 初始条件:队列 Q 已存在。 操作结果:插入元素 e 为 Q 的新的队尾元素。DeQueue(&Q,&e) 初始条件: Q 为非空队列。 操作结果:删除 Q 的队头元素,并用 e 返回其值。 QueueTraverse(Q,visit() 初始条件: Q 已存在且非空。一旦操作结果:从队头到队尾,依次对 Q 的每个数据元素调用函数 visit() visit() 失败,则操作失败。ADT Queue3 2 模块划分本程序包括六个模块: (1)主程序模块vo
7、id main()初始化停车站; 初始化让路的临时栈; 初始化通道; 输出主菜单:车辆到达、车辆离开与计费、查看停车场信息;( 2 )入场模块int arrive(SqStack *In,LinkQueue *W)车辆进入停车场; 计算停车费用 ( 3 )出场模块void leave(SqStack *In,SqStack *Out,LinkQueue *W)车辆离开停车场;( 4 )输出模块void info(SqStack S,LinkQueue W)输出停车场信息;(5)栈模块实现栈的抽象数据类型(6)队列模块实现队列的抽象数据类型4 详细设计41 数据类型的定义int MAX; /*
8、定义一个全局变量用来存储车库最大容量 */float price;/* 定义一个全局变量用来存储每车每小时的费用 */ typedef struct timeint hour;int min;Time; /* 时间结点 */typedef struct nodechar num10;Time reach;Time leave;Car; /* 车辆信息结点 */typedef struct NODECar *stack100;int top;SqStack; /* 停车站 */typedef struct carCar *data;struct car *next;QNode;typedef s
9、truct NodeQNode *head;QNode *rear;LinkQueue; /* 通道 */4 2 主要模块的算法描述本程序主要分为四部分: (1)主函数及程序框架、 (2)车辆到达模块、(3)车 辆离开模块、(4 )显示车辆信息模块,(1)主函数void main()SqStack In,Out; LinkQueue Wait;int ch;InitStack(&In); /* 初始化停车站 */InitStack(&Out); /* 初始化让路的临时栈 */InitQueue(&Wait); /* 初始化通道 */while(1)printf(&quo
10、t; 欢迎使用停车场管理系统n");printf("t 本系统由 5011 工作室开发,作者 :邓春国、段庆龙、梁伟明、 丁磊。 nn");printf(" 请输入停车场的容量 :");scanf("%d",&MAX);printf(" 请输入停车场的收费标准 (元/ 小时):");scanf("%f",&price);printf("您输入的停车场容量为d位,费用为2.1f元/小时。 n",MAX,price);printf("n (1)
11、车辆到达n车辆离开n (3)停车场信息n (4)退出系统 n 请选择 n");while(1)ch=getch();switch(ch)case 49:arrive(&In,&Wait);break; /* 车辆到达 */case 50:leave(&In,&Out,&Wait);break; /* 车辆离开 */ case 51:info(In,Wait);break; /* 输出车站信息 */ case 52:printf(" 使用! ");exit(0); /* 退出主程序 */ default:printf(&quo
12、t;n 按键无效,请重新按键选择! ");/*49 -52分别表示“ 1”-“4”这四个按键的键值 */ system("CLS");printf(" 欢迎使用停车场管理系统n");printf("t本系统由CG工作室开发,作者:邓春国、段庆龙、梁伟明、 丁磊。 nnn");printf("您输入的停车场容量为d位,费用为2.1f元/小时。n",MAX,price);printf("n (1)车辆到达n (2)车辆离开n (3)停车场信息n (4)退出 系统n请选择n");(2)车辆离
13、开模块I算法分析void leave(SqStack *In,SqStack *Out,LinkQueue *W) /*车辆离开*/int room;Car *p,*t;QNode *q;/* 开始定义一个整型变量 room ,用来记录要离开的车辆在停车场的位置,定 义车辆结点指针 p 和 t 和队列结点指针 q 。*/if(In->top>0) /* 有车 */while(1)printf("n 请输入车在停车场的位置 (1-%d) : ",In->top); scanf("%d",&room);if(room>=1&a
14、mp;&room<=In->top) break;/* 判断停车场是否有车,如果有车,就输入要离开的车辆在停车场的位置,否 则就提示停车场没车。这里用了 while 循环语句,如果输入的车辆位置超出围,就 要重新输入。 */while(In->top>room) /* 车辆离开 */Out->top+;Out->stackOut->top=In->stackIn->top; In->stackIn->top=NULL;In->top-;/* 如果栈顶位置 In->top 大于要离开的车位置 room (即要离
15、开的车不在停 车场的门口)的话,在要离开的车辆前面的车就要先离开,开到临时停车场,即临时 栈中,因此 Out 所表示的临时栈的栈顶 top 加 1 ,用来表示临时停车场增加 1 辆 车;接着把该车的信息拷贝到栈 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->stac
16、kOut->top=NULL; Out->top-;/* 直到要离开的车辆前面的车都开到临时停车场之后, 该车才离开,离开之后, 该车的信息结点 In->stackIn->top 置空,然后栈顶 In->top 减 1 。之后就判 断临时停车场是否有车,有车就一辆一辆的开回停车场里面,因此停车场的栈顶 In->top 加 1,然后就把临时停车场的车结点的信息拷贝到停车场的车结点上,接 着删除临时停车场车的结点 (即Out->stackOut->top=NULL;Out->top-;)。 */PRINT(p,room); if(W->h
17、ead!=W->rear)&&In->top<MAX) q=W->head->next;t=q->data;In->top+;printf("n便道的s号车进入车场第d号停车位。",t->num,In->top);printf("n 请输入现在的时间 (格式“ *:* ” ):"); scanf("%d:%d",&(t->reach.hour),&(t->reach.min); W->head->next=q->next
18、;if(q=W->rear) W->rear=W->head;In->stackIn->top=t;free(q);/* 判断 (W->head!=W->rear)&&In->top<MAX(即通道上是否有车及停车场是否已满),如果便道有车且停车场未满,通道的车便可进入停车场,此时 指针q指向便道的头,即队头,然后停车场的栈顶In->top加1以便增加新的车辆,接着输入队头的车辆信息, 即要进去停车场的车的信息, 然后便道队列的头结点 指向q (即刚进入停车场的车的结点)的后继结点,即原队列中第二辆车的结点,接 着判断
19、刚离开的车是否是最后一辆车,如果是,就把队列置空,即队头等于队尾;之后就把结点t (即要进入停车场的车)的信息拷贝到停车场栈顶的车中,最后释放p的空间,即原队头结点。*/else printf("n停车场里没有车n"); /*没车*/printf("请按任意键返回");getch();图4.1 leave函数流程图5测试分析测试数据及结果如下:输入2辆车的信息,如图5.2所示:再输入2辆车的信息,如图最后选择车辆离开,输入第2辆车离开,如图日收扌居22进车场时刻:出车场时刻:停留时间所在的停车位为:2选挥 i<fl,D,E>请选择:<A
20、,D,E)-停车场爸理程序-车牌号:2iS'SS'SSSSSS应付(元)汽车进车场 D汽车岀车场 *E退岀程序*'C:User5 Adm n i 11 rat?r. PC -20141024YL PI' Des let g pDeb dgCp|t 1.ex e6课程设计总结通过这次课程设计使我充分的理解了用栈和队列实现模拟停车场的基本原理,知道了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。虽然此次的程序不是很完备,没有加入一些更完善的功能,但是 总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学
21、者来说。在刚开始编程的时候,我感到有点无从下手,但经过对题目的详细分析和思 考之后,我就知道具体应该做什么,怎么做了。经过几天和同学的一起研究,我完成 这个程序,我学到了很多东西,这是在课堂上无法做到的。源程序#in clude<stdio.h>#in elude <stdlib.h>#include<iostream.h> #include<string.h>#include<math.h>#define size 1 / 停车场位置数/ 模拟停车场的堆栈的性质;typedef struct zanlindint number; /
22、 汽车车号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.base) exit(0);L.top=L.base;L.stacksize_curren=0;*L.top+=e;L.stacksiz
23、e_curren+;void pop(stackhead &L,zanInode &e) / 把元素 e 弹出 s 栈if(L.top=L.base)cout<<" 停车场为空 !"return;e=*-L.top;L.stacksize_curren-;/ 模拟便道的队列的性质;typedef struct duilieint number; / 汽车车号int ar_time; / 汽车到达时间struct duilie *next;*queueptr;typedef structqueueptr rear; / 便道的队列的队尾int le
24、ngth;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.length=0;把元素的插入队列(属性为number ,void enqueue(linkqueue &q,int number,int ar_time) / ar_time )queueptr p; p=(queueptr)malloc(sizeof(
25、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+;numbervoid popqueue(linkqueue &q,queueptr &w) / 把元素的插入队列(属性为 ar_time )queueptr p;if(q.front=q.rear)cout<<" 停车场的通道为空 ! !"<<endl;return;p=q.front->next
26、;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<<" 车牌为: "cin>>number;cout<<" 进场的时刻 :"cin>>time_a;if(st.stacksize_curren<2)zanInode e;e.number=num
27、ber;e.ar_time=time_a;push(st,e);cout<< " 该车已进入停车场在 : "<<st.stacksize_curren<<" 号车道 "<<endl<<endl;elseenqueue(q,number,time_a);cout<<" 停车场已满,该车先停在便道的第 "<<q.length<<" 个位置上 "<<endl;void likai(stackhead &st
28、,stackhead &sl,linkqueue &q) /对离开的汽车的处理;int number,time_d,flag=1,money,arrivaltime; /q 为便道队列 cout<<" 车牌为: "cin>>number;cout<<" 出场的时刻: "cin>>time_d;zanInode e,q_to_s;queueptr w;while(flag) / 找到要开出的车,并弹出停车场栈pop(st,e);push(sl,e);if(e.number=number)fla
29、g=0;money=(time_d-e.ar_time)*2;arrivaltime=e.ar_time;pop(sl,e); / 把临时堆栈的第一辆车(要离开的)去掉; while(sl.stacksize_curren) / 把倒车场的车倒回停车场push(st,e);if(st.stacksize_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<<e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青少年法治教育路径优化研究
- 新能源发电系统中储能系统的应用分析
- 处方点评自查报告
- 酒店客房出入管理制度
- 护理文书书写大赛活动方案
- 2024-2025学年鲁教版高二上学期期末地理试卷及答案指导
- 外贸求职信范文
- 露天矿安全生产年度总结
- 低压电缆敷设安全生产方案
- 怀化学院《外国文学》2023-2024学年第一学期期末试卷
- 2024塔吊司机的劳动合同范本
- 2024年国家公务员考试《行测》真题卷(副省级)答案及解析
- 江苏省南京市秦淮区2023-2024学年八年级上学期期中语文试题及答案
- 2024年个人车位租赁合同参考范文(三篇)
- (完整版)新概念英语第一册单词表(打印版)
- 签申工作准假证明中英文模板
- 员工履历表(标准样本)
- 2024年山东省济南市中考数学真题(含答案)
- 山东省青岛市黄岛区2023-2024学年六年级上学期期中语文试卷
- 二手门市销售合同范本
- 新能源发电技术 课件 第一章-新能源发电概述
评论
0/150
提交评论