数据结构课程设计停车场管理系统.docx
- 文档编号:26300176
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:19
- 大小:21.74KB
数据结构课程设计停车场管理系统.docx
《数据结构课程设计停车场管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计停车场管理系统.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计停车场管理系统
.
数据结构
设计:
停车场管理
姓名:
韦邦权
专业:
2013级计算机科学与技术
学号:
13224624
班级:
13052316
完成日期:
2013.12.19
精选文档.
.
1问题描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个门可供出入。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原顺序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
2需求分析
1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车(场的调度功能。
3)用顺序栈来表示停车场,链队表示停车场外的便道。
(4)显示停车场信息和便道信息。
(
○○○5显示停车车辆离开停车场车辆进入停车场()程序执行的命令为:
312场的信息。
3概要设计
3.1抽象数据类型定义
1)栈的抽象数据类型定义(ASTStack{
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}数据对象:
R1={
ana1端为栈底约定端为栈顶,。
基本操作:
InitStack(&S)
S。
操作结果:
构造一个空栈
DestroyStack(&S)精选文档.
.
S已存在。
初始条件:
栈
S被销毁。
操作结果:
栈
ClearStack(&S)
S已存在。
初始条件:
栈
S清为空栈。
操作结果:
将栈
StackEmpty(S)
S已存在。
初始条件:
栈
STRUEFALSE。
为空栈,则返回操作结果:
若栈,否则StackLength(s)
S已存在。
初始条件:
栈S的元素个数,既栈的长度。
操作结果:
返回GetTop(S,&e)
S已存在且非空。
初始条件:
栈eS的栈顶元素。
返回操作结果:
用Push(&S,e)
S已存在。
初始条件:
栈
e为新的栈顶元素。
操作结果:
插入元素
Pop(&S,&e)
初始条件:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
S已存在且非空。
初始条件:
栈visit()visit()。
一旦的每个数据元素调用函数S操作结果:
从栈底到栈顶依次对失败,则操作失效。
}ADTStack
2)队列的抽象数据类型定义(ADTQueue{
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}数据对象:
R1={
a1an为队列尾。
约定其中端为队列头,基本操作:
精选文档.
.
InitQueue(&Q)
Q。
操作结果:
构造一个空队列
DestroyQueue(&Q)
Q已存在。
初始条件:
队列
Q被销毁,不再存在。
操作结果:
队列
ClearQueue(&Q)
Q已存在。
初始条件:
队列Q清为空队列。
操作结果:
将QueueEmpty(Q)
Q已存在。
初始条件:
队列QTRUEFALSE。
操作结果:
若,否则为空队列,则返回QueueLength(Q)
Q已存在。
初始条件:
队列Q的元素个数,即队列的长度。
操作结果:
返回GetHead(Q,&e)
Q为非空队列。
初始条件:
e返回的队头元素。
操作结果:
用
EnQueue(&Q,e)
Q已存在。
初始条件:
队列
eQ的新的队尾元素。
操作结果:
插入元素为DeQueue(&Q,&e)
初始条件:
Q为非空队列。
操作结果:
删除Q的队头元素,并用e返回其值。
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空。
Qvisit()。
一旦操作结果:
从队头到队尾,依次对的每个数据元素调用函数visit()失败,则操作失败。
}ADTQueue
3.2模块划分
本程序包括六个模块:
1)主程序模块(精选文档.
.
voidmain()
{
初始化停车站;
初始化让路的临时栈;
初始化通道;
输出主菜单:
车辆到达、车辆离开与计费、查看停车场信息;
}
2)入场模块(
intarrive(SqStack*In,LinkQueue*W)
{
车辆进入停车场;
计算停车费用
}
3)出场模块(voidleave(SqStack*In,SqStack*Out,LinkQueue*W)
{
车辆离开停车场;
}
4)输出模块(voidinfo(SqStackS,LinkQueueW)
{
输出停车场信息;}
5)栈模块——实现栈的抽象数据类型(6)队列模块——实现队列的抽象数据类型(
精选文档.
.
4详细设计
4.1数据类型的定义
intMAX;/**/定义一个全局变量用来存储车库最大容量floatprice;/**/定义一个全局变量用来存储每车每小时的费用
typedefstructtime
{
inthour;
intmin;
}Time;/**/时间结点typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}Car;/**/车辆信息结点typedefstructNODE{
Car*stack[100];
inttop;
}SqStack;/**/停车站typedefstructcar{
Car*data;
structcar*next;
}QNode;
typedefstructNode{
精选文档.
.
QNode*head;
QNode*rear;
}LinkQueue;/**/通道4.2主要模块的算法描述
123)车(本程序主要分为四部分:
()车辆到达模块、)主函数及程序框架、(4)显示车辆信息模块,辆离开模块、
(1)主函数(voidmain()
{
SqStackIn,Out;LinkQueueWait;
intch;
InitStack(&In);/**/初始化停车站InitStack(&Out);/**/初始化让路的临时栈InitQueue(&Wait);/**/初始化通道while
(1)
{
printf(----------------------------------------\n);欢迎使用停车场管理系统printf(\5011工作室开发,作者:
邓春国、段庆龙、梁伟明、丁本系统由\n\n);磊。
牰湩晴尨:
);请输入停车场的容量scanf(%d,&MAX);
牰湩晴尨:
);)/请输入停车场的收费标准(元小时scanf(%f,&price);
%2.1f牰湩晴尨%d小时。
位,费用为您输入的停车场容量为/元\n,MAX,price);
\n\n\n1printf(\
234\n退出系统)车辆离开()车辆到达()()停车场信息(\n);请选择while
(1)
精选文档.
.
{
ch=getch();
switch(ch)
{
case49:
arrive(&In,&Wait);break;/**/车辆到达case50:
leave(&In,&Out,&Wait);break;/**/车辆离开case51:
info(In,Wait);break;/**/输出车站信息慣敳?
?
灻楲瑮?
谢谢使用!
);exit(0);}/**/退出主程序default:
printf(\
);按键无效,请重新按键选择!
}/*495214*/”这四个按键的键值”--分别表示““system(CLS);
printf(--------------------欢迎使用停车场管理系统--------------------\n);
CGprintf(\邓春国、段庆龙、梁伟明、工作室开发,作者:
本系统由\n\n\n);丁磊。
%2.1f%d牰湩晴尨小时。
位,费用为/您输入的停车场容量为元\n,MAX,price);
4\nprintf(\
1\n23\n退出系)()(车辆到达)停车场信息()车辆离开(\n\n);请选择统}
}
}
2)车辆离开模块(
○算法分析1
voidleave(SqStack*In,SqStack*Out,LinkQueue*W)/**/车辆离开
{
introom;
Car*p,*t;QNode*q;
/*room,用来记录要离开的车辆在停车场的位置,定开始定义一个整型变量精选文档.
.
义车辆结点指针精选文档.
.
ptq*/。
和和队列结点指针if(In->top>0)/**/有车{
while
(1)
{
printf(\
(1-%d):
In->top);请输入车在停车场的位置scanf(%d,&room);
if(room>=1&&room<=In->top)break;
}/*判断停车场内是否有车,如果有车,就输入要离开的车辆在停车场的位置,while循环语句,如果输入的车辆位置超出范围,否则就提示停车场没车。
这里用了*/就要重新输入。
while(In->top>room)/**/车辆离开{
Out->top++;
Out->stack[Out->top]=In->stack[In->top];
In->stack[In->top]=NULL;In->top--;
}/*In->toproom(即要离开的车不在停车大于要离开的车位置如果栈顶位置场的门口)的话,在要离开的车辆前面的车就要先离开,开到临时停车场,即临时栈Outtop11辆车;所表示的临时栈的栈顶加中,因此,用来表示临时停车场增加OutIn*/。
的栈顶(即这辆车开走)接着把该车的信息拷贝到栈中,然后删除栈p=In->stack[In->top];
In->stack[In->top]=NULL;In->top--;
while(Out->top>=1)
{
In->top++;In->stack[In->top]=Out->stack[Out->top];
Out->stack[Out->top]=NULL;Out->top--;
精选文档.
.
}
/*直到要离开的车辆前面的车都开到临时停车场之后,该车才离开,离开之后,In->stack[In->top]In->top1。
之后就判断临时该车的信息结点减置空,然后栈顶In->top加有车就一辆一辆的开回停车场里面,因此停车场的栈顶停车场是否有车,1,然后就把临时停车场的车结点的信息拷贝到停车场的车结点上,接着删除临时停Out->stack[Out->top]=NULL;Out->top--;*/。
)车场车的结点(即PRINT(p,room);
if((W->head!
=W->rear)&&In->top { q=W->head->next;t=q->data;In->top++; printf(\ %s%d。 号停车位号车进入车场第便道的,t->num,In->top); (“**: **”): );printf(\ 格式请输入现在的时间scanf(%d: %d,&(t->reach.hour),&(t->reach.min)); W->head->next=q->next; if(q==W->rear)W->rear=W->head; In->stack[In->top]=t; free(q);}/*(W->head! =W->rear)&&In->top } elseprintf(\ \n);/**/没车停车场里没有车精选文档. . 牰湩晴尨);请按任意键返回getch(); } ○4.1所示: 2leave函数流程图如图 开始定义必要的变量否判断停车场是否有车是输出停车场里没有车输入离开车辆的信息否判断前面是否有其他车且停车场未满是前面的车先进入临时停车车辆离车临时停车场的车回到停车判断便道否有便道的车先进入停车结束函数流程图leave图4.1 精选文档. . 5测试分析 测试数据及结果如下: 输入2辆车的信息,如图5.2所示: 辆车的信息,如图2再输入 精选文档. . 2辆车离开,如图最后选择车辆离开,输入第 6课程设计总结知通过这次课程设计使我充分的理解了用栈和队列实现模拟停车场的基本原理,同时也学会了编写道了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,但是没有加入一些更完善的功能,虽然此次的程序不是很完备,停车场问题的程序。 当然只是相对于我这个初学总体还是一个比较能体现数据结构知识点能力的程序了,但经过对题目的详细分析和思我感到有点无从下手,者来说。 在刚开始编程的时候,考之后,我就知道具体应该做什么,怎么做了。 经过几天和同学的一起研究,我完成这个程序,我学到了很多东西,这是在课堂上无法做到的。 源程序 #include . #include #definesize1//停车场位置数 //模拟停车场的堆栈的性质; typedefstructzanlind{ intnumber;//汽车车号 intar_time;//汽车到达时间 }zanInode; typedefstruct{ zanInode*base;//停车场的堆栈底 zanInode*top;//停车场的堆栈顶 intstacksize_curren; }stackhead; //堆栈的基本操作; voidinitstack(stackhead&L)//构造一个空栈 { L.base=(zanInode*)malloc(size*sizeof(zanlind)); if(! L.base)exit(0); L.top=L.base; L.stacksize_curren=0; } voidpush(stackhead&L,zanInodee)//把元素e压入s栈 { *L.top++=e; L.stacksize_curren++; } voidpop(stackhead&L,zanInode&e)//把元素e弹出s栈 { if(L.top==L.base) { 潣瑵? 停车场为空! ! ; return; } e=*--L.top; L.stacksize_curren--; } //模拟便道的队列的性质; typedefstructduilie{ intnumber;//汽车车号 intar_time;//汽车到达时间 structduilie*next; }*queueptr; typedefstruct{ queueptrfront;//便道的队列的对头 queueptrrear;//便道的队列的队尾精选文档. . intlength; }linkqueue; //队列的基本操作; voidinitqueue(linkqueue&q)//构造一个空队列 { q.front=q.rear=(queueptr)malloc(sizeof(duilie)); if(! q.front||! q.rear) exit(0); q.front->next=NULL; q.length=0; } voidenqueue(linkqueue&q,intnumber,intar_time)//把元素的插入队列(属性为number,ar_time) { queueptrp; 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++; } voidpopqueue(linkqueue&q,queueptr&w)//把元素的插入队列(属性为number,ar_time) { queueptrp; if(q.front==q.rear) { 潣瑵? 停车场的通道为空! ! < return; } p=q.front->next; w=p; q.front->next=p->next; q.length--; if(q.rear==p)q.front=q.rear; } voidjinru(stackhead&st,linkqueue&q)//对进入停车场的汽车的处理; { intnumber,time_a; 潣瑵? 车牌为: ; cin>>number; 潣瑵? 进场的时刻: ;精选文档. . cin>>time_a; if(st.stacksize_curren<2) { zanInodee; e.number=number; e.ar_time=time_a; push(st,e); cout<<该车已进入停车场在: < } else { enqueue(q,number,time_a); 潣瑵? 停车场已满,该车先停在便道的第? 焼氮湥瑧? 尼个位置上< } } voidlikai(stackhead&st,stackhead&sl,linkqueue&q)//对离开的汽车的处理; {//st堆栈为停车场,sl堆栈为倒车场 intnumber,time_d,flag=1,money,arrivaltime;//q为便道队列 潣瑵? 车牌为: ; cin>>number; 潣瑵? 出场的时刻: ; cin>>time_d; zanInodee,q_to_s; queueptrw; 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.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<<\ 收据< cout<<======================车牌号: < cout<<===================================================< cout<<|进车场时刻|出车场时刻|停留时间|应付(元)|< cout<<====================================================< cout<<|< |< cout<<-----------------------------------------------------< } voidmain() { intm=100; charflag;//进入或离开的标识; stackheadsting,slinshi;//停车场和临时倒车场堆栈的定义; linkqueueline;//队列的定义; initstack(sting);//构造停车场堆栈sting initstack(slinshi);//构造倒车场堆栈slinshi initqueue(line);//构造便道队列line while(m) { cout<<\ **停车场管理程序**<<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 停车场 管理 系统