数据结构实验二停车场管理问题.docx
《数据结构实验二停车场管理问题.docx》由会员分享,可在线阅读,更多相关《数据结构实验二停车场管理问题.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构实验二停车场管理问题
数据结构实验二:
停车场管
理问题(总17页)
本页仅作为文档封面,使用时可以删除
Thisdocumentisforreferenceonly-rar21year.March
HUNANUNIVERSITY
课程实习报告
目:
停车场管理问题
学生姓名
学生学号
专业班级
指导老师
完成日期2015年口月25日
一、需求分析
1•输入的形式的输入的范围:
1.选择功能:
1停车2离开停车场3离开过逍
2.若输入1(停车),输入当前车牌号和当前的时间:
若输入2(离开停车场),输入车票号和当前时间;若输入3(离开过道),输入车牌号。
2.输出的形式:
®.提示选择功能“1.停车2离开停车场3离开过道”。
2.若输入1(停车),并且输入肖前车牌号和当前的时间后,若停车场未满,输出“成功停入停车场,停车场内有n辆车,过道上有m辆车等候”;若停车场满,输出“停车场已满,请在过逍等候”。
若输入2(离开停车场),输入车票号和当前时间,输岀“存车总计时间,收费q元,停车场内有n辆车,过道上有m辆车等候”:
如果进停车场和出停车场时间错误,输出“时间输入有误,请重新输入”:
如果停车场没有此车,输出“车牌号有误,请重新输入”。
若输入3(离开过道),输入车牌号,输出“此车已成功离开过道”;若无此车,输出“停车过道为空”。
若输入其他,则提示选择功能“1•停车2藹开停车场3离开过道”o
3.程序所能达到的功能:
有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进岀。
车辆按到达停车场时间的早晚依次从停车场最里而向大门口处停放(最先到达的第一辆车放在停车场的最里而)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开疋,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开疋,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
4•测试数据:
①正常的进入停车场,出停车场,离开过道的模拟
输入1
1(车牌)
1(当前时间)
输入1
2(车牌)
2(当前时间)
输入2
2(车牌)
3(当前时间)
输入1
3(车牌)
4(当前时间)
输入1
4(车牌)
5(当前时间)
输入3
4(车牌)
2.停车场里没有车出停车场的模拟
输入2
1(车牌)
3.过道没车出过道的模拟
输入3
1(车牌)
4.进入停车场时间与出停车场时间的模拟
输入1
1(车牌)
1(进停车场的时间)
输入2
1(车牌)
0(岀停车场的时间)
5.停车场模拟系统功能输入错误
输入4
二•概要设计
抽象数据类型:
①.由于该停车场只有一个门供出入,并且最先进的停在停车场的最末,最先进的车辆要出停车场需要之后进入的车先出,满足先进后出的结构,瓦限制是仅允许在表的一端进行插入和删除运算,所以用栈来模拟停车场,
(2)•由于这是一个模拟的车库,车辆出停车场,后面车辆不得不被动跟着出停车场,我们需要对这些车辆进行管理,将第一辆被动出停车场的放置到一个队伍的前端,接下来被动出停车场的车辆依次放到第一辆车之后,当需要离开的车出栈后,对被动出停车场的车辆进行管理,又队伍的前端依次进入停车场,由于满足只允许在表的前端进行删除操作,而在表的后端进行插入操作,所以用队列来模拟被动岀停车场车辆的管理。
基本思想
1•给定一个size为停车场的容量。
2.每一辆车进栈前,储存车辆编号和进栈的时间。
3•对于栈满的情况,再来的车辆不进栈,只记录编号。
4.对于出栈的车辆,先将出栈车辆之前的停车场内车辆由后往前依次进入队列中,将进栈和出栈时间相比较算出需要付的金额,之后再将队列中的元素由前往后依次进栈。
程序的流程
程序由三个模块组成:
输入模块:
按照提示输入
计算模块:
计算(出栈时间-进栈时间)*每小时金额。
输出模块:
首先提示"请选择:
1、停车;2、离开停车场;3、离开过道:
"
选择提示"请输入车牌号和现在的时间:
”
选择3提示“请输入车牌号”
基本ADT
1.栈空判别算法
intEmpty_SeqStack(queue*s)
{
if(s->top==-1)
return0;
else
return1;
}
2.入栈算法
voidPush_SeqStack(queue*s,Datatypex){
s_>top++;
s->datal[s->top]=x;
return;
}
3.出桟算法
voidPop_SeqStack(queue*s,Datatype*x)
*x=s->datal[s->top];s->top—;
return;
4.列队初始化
C_SeQueue*Init_SeQueue()
{
C_SeQueue*q;
q=newC_SeQueue;
q*>front=q->rear=MAXSIZE一1;q*>num=0;
returnq;
}
5.入队算法
voidIn_SeQueue(C_SeQueueDatatypex)
{
q*>rear=(q">rear+1)%MAXSIZE;
q->data2lq~>rear.=x;
q・>rmm++;
return;
}
6.出队算法
voidOut_SeQueue(C_SeQueue*q,Datatype*x){
q->front=(q">front+1)%MAXSIZE;
*x=q~>data2[q~>front];
q->num—;
return;
}
算法流程图(进入车库和出车库)
汽车进入
汽车离开
三・详细设计
1.数据类型
用Int型整数储存车辆的信息•车辆进出时间•收取的费用
2.算法的具体步骤
①车进入停车场的基本操作
voidArrive(queue*s,C_SeQueue*q,intx,doublet)
inty;
inta=s*>top;
while(a!
=T)法的时空分析和改进设想
每次进栈的时间复杂度为0
(1),当要出车辆后有n辆车时,出栈时间复杂度为0(n〉,也许对于•个车库来说n并不会很大,但是考虑实际这个停车场的设计非常不合理。
4.输入和输出格式
输入:
功能选择输入为整数1-3,输入车牌号为大于零的整数,时间为人于零的整数。
输出:
输出整数型的应收的价格
四.调试分析
1.为了简化程序,采用手动输入进栈车辆的排序.进栈时间•出栈时间。
2.同时因为需要输入多组数据,在程序完工后又加上许多引导性的话,例如提示停车场内有几辆车.停车场外有多少车.车辆是否进入车库成功.车辆是否在车库外等候。
3.对于时间的处理过于简附,只用了•位数衣示时间,与实际情况不太符合。
4.对于车牌处理也过于简单,可以在车的储存信息加入车牌号。
五.测试结果
情况1测试结果
情况3测试
情况4测试
情况5测试
六・试验心得
I•书上对栈的实现太少不详细,查阅了许多栈的各类实现怎么写。
2•存车取车问题比较简单,在程序完成后发现程序的容错率为0,当不小心输入了相同车牌时程序直接报错,不得不添加了许多容错代码,容错程序代码很是让人费神,现在容错已完善再完善了,但还是未能完全解决问题,例如,在过道停的车辆不能保证其中没有相同车牌号的车,还有时间处理的比较简单原始化,这些都有待以后提高,继续完善,
3•这道题过于死板,完全是为了栈强行设计了一道门的停车场,每次有车出来后面的车都要移动位置,这种车库,不停也罢,
七・代码
Sinelude
usingnamespacestd;
^defineMAXSIZE10
SdefineMINSIZE2
typedefintDatatype;
typedefstruct{
Datatypedatal[MINSIZE]:
inttop;
doubletime[MINSIZE];
}queue;
queue*Init_SeqStack()/栈的初始化;
queue*s;
s=newqueue;
if(!
s){
cout«"空间不足"«endl;
returnNULL;
}
else{
s->top=T;
returns;
}
}
intEmpty_SeqStack(queue*s)//栈空判别算法:
{
if(s->top==-1)
return0;
else
return1:
}
voidPush_SeqStack(queue*s.Datatype:
■:
)//
{
s_>top++;
s*>datal[s">top]=x;
return;
}
intPush_SeqStackl(queue*s,Datatypex,doublet)//入戎养」丿:
1:
{
if(s->top==MINSIZE-1)
return0;
else{
s_〉top++;
s*>datal[s->top]=x;
s*>time[s->top]=t;
return1:
}
}
voidPop^SeqStack(queue*s,Datatype*:
■:
)//出栈算法:
{
*x=s->datal[s->top];
s_>top―;
return;
typedefstruct
Datatypedata2[MAXSIZE];
intrear,front;
intnum;
}C_SeQueue;
C_SeQueue*Init_SeQueue()//列;i化:
{
C_SeQueue*q;
q=newC_SeQueue;
q->front=q->rear=MAXSIZE一1:
q*>num=0;
returnq;
voidIn_SeQueue(C_SeQueue*qfDatatypex)//A队算法:
{
q->rear=(q->rear+1)%MAXSIZE;
q">data2[q~>rear.=x;
q_>num++;
return;
}
voidOut_SeQueue(C_SeQueue*q,Datatype*x)//tH队算法:
{
q->front=(q">front+1)%MAXSIZE;
*x=q->data2[q->front];
q->num—;
return;
}
voidshow(queue*s,C_SeQueue*q),7显示停车情况:
{
cout«"停乍场内仃"«s~>top+1«"辆车。
"«endl:
cout«"通道上有"«q->num«辆车在等候。
"«endl;
}
voidArrive(queue*s,C_SeQueue*q,intx,doublet)•/停乍:
{
inty;
inta=s->top;
while(a!
=-1)〃判断将要存的乍是否已存在「•停乍场,防止出现有相同车牌号的车
出现在停车场内:
if(s->datal[a]==x)cout«成功停入乍场"«endl:
return;
}
else
a~;
}
if(Push_SeqStackl(s,x,t))
cout«"成功停入车场。
"«endl;
else
{
cout«"停车场已满,后來车辆请在便道等候。
"«endl;
In_SeQueue(qtx);
}
show(stq);
}
voidLeave(queueC_SeQueue*q,intx,doublet)阐丿卜停乍场:
{
inty;
inti=1;
doubled;
queue*sl;
si=Init_SeqStack();
while(s*>datal[s">top]!
=:
:
&&!
Empty_SeqStack(s))
{
Pop_SeqStack(s,&y);
Push_SeqStack(sl,y);
}
if(s->datal[s->top]==x)
{
while(i)
{
if(t>=1&&t<=24&&t>s->time[s->top])
{
d=t~s->timeLS">top]:
Pop_SeqStack(st&y);
cout«"存车时间总计:
"«d«"小时"«endl
«少收费为:
"«d«瘁元円«endl;
i=0;
}
else
{
cout«"时间输入有误,请重新输入「«endl;//时间容错
处理:
cin»t:
else
{
cout«"车牌号有误,停车场中无此车。
"«endl;"容错,离开时也要输入正确车牌号,否则无此车,也不耽误程序执行:
}
书h订e(Empty_SeqStack(sl)!
=0)
{
Pop_SeqStack(si,&y);
Push_SeqStack(sfy);
}
if(q->num!
=0&&s->top!
=MINSIZE-1)
{
Out_SeQueue(qt&y);
Push_SeqStackl(s,y,t);
}
show(stq);
return;
}
voidLeave1(queue*s,C_SeQueue*q,intx)阖卄过道:
{
if(q->num==0)
{
cout«"停车过道为空。
"«endl;
return;
}
inta=q->rear:
while(q->data2[a]!
=x&&(a+MAXSIZE)%MAXSIZE!
=q->front)if(q->data2[(a+MAXSIZE)%MAXSIZE]==x)
{
while((a十MAXSIZE)%MAXSIZE!
=q->rear-1){
q">data2[a]=q">data2[a+1];
a十十;
}
q">num—;
cout«"此车己成功离开过逍c”«endl;
else
cout«"此车不在过逍中.”«endl;
show(stq);
}
voidmainO
{
doubletime;
intx,a;
queue*s;
C_SeQueue*q;
s=Init_SeqStack();
q=Init_SeQueue0:
wh订e
(1)
{
cout«"请选择:
1、停车:
2、离开停车场:
3、离开过道:
"«endl;cin»a;
switch(a)
{
case1:
{
cout«"请输入车牌号和现在的时间:
”«endl:
cin>>x>>time;
Arrive(s,q,x,time):
}break;
case2:
{
cout«"请输入车牌号和现在的时间:
”«endl;cin»x>>time;
Leave(s,q,x,time):
}break;
case3:
{
cout«"请输入车牌号:
"«endl;
cin>>x;
Leavel(s,q,x);
cout«endl;
}break;
case0:
return;