停车场管理实验报告Word格式.docx
- 文档编号:17310602
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:14
- 大小:167.74KB
停车场管理实验报告Word格式.docx
《停车场管理实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《停车场管理实验报告Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
(4)测试数据:
(5)请输入停车场容量2
A,1,1
车停在停车场第1个位置
A,2,2
车停在停车场第2个位置
A,3,3
车停在便道第1个位置
D,1,4
停车时间:
3缴纳费用:
¥3
D,2,5
A,5,5
E,0,0
二、概要设计
抽象数据类型
由于每一辆车有多个数据,所以定义一个类来存储汽车的“车牌号、时间”信息。
classcData
{
Public:
intnumber;
intatime;
};
停车场的大小是固定的,且只有一个口用于进出,所以用顺序栈模拟停车场,其ADT如下:
ADTstack
数据对象:
D=(a1,a2…ai|aiЄcData)
数据关系:
R1={<
ai-1,ai>
|ai-1,aiЄD,i=2,3…n}
基本操作:
boolpush(constcData&
elem)//入栈
boolpop(constcData&
elem)//出栈
booltopValue(cData&
elem)//顶层元素值
intlength()const{returntop;
}//栈的实际长度
便道的大小未定,为了节约空间我们应该用链表实现队列,用队列模拟便道,ADT如下:
ADTquene
cData类型。
boolenquene(constcData&
elem)//入队列
booldequene(cData&
elem)//出队列
virtualintlength()const{return((rear+size)-front+1)%size;
}//队列的实际长度
算法的基本思想
对于指定大小的停车场,只有一个口进入或者出去,先进后出,用栈存储,如果入栈失败则将车停到便道上,先到便道的车先进停车场,用队列存储,当某辆汽车出去时,在它后面的汽车要先退出再按原顺序进入车场,需要一个临时的存储空间来停这些车,而由于是最后一辆车在某辆车出去的时候要先出去而又最后进去,这个临时的存储空间应该是一个栈。
三、详细设计
实现概要设计中的数据类型
分别用整形、整形存储用户的输入,并将相应数据存入cData类。
用顺序栈表实现栈:
classStack
private:
intsize;
inttop;
cData*listArray;
public:
Stack(intsz)
{size=sz;
top=0;
listArray=newcData[sz];
}
~Stack(){delete[]listArray;
boolpush(constcData&
elem)//进栈
{
if(top==size)returnfalse;
else
listArray[top]=elem;
top++;
returntrue;
}
}
boolpop(cData&
elem)//出栈
if(top==0)returnfalse;
elem=listArray[top-1];
top--;
booltopValue(cData&
elem)//顶层元素值
if(top==0)returnfalse;
it=listArray[top-1];
intlength()const{returntop;
}//栈实际长度
};
用顺序表实现队列(由于题目中没有明确表明便道的长度,队列应该用链表来实现比较合适且节省空间,但是为了方便程序的设计这里采用顺序表来实现):
classQuene
intfront;
intrear;
Quene(intsz){size=sz+1;
rear=0;
front=1;
listArray=newcData[size];
~Quene(){delete[]listArray;
boolenquene(constcData&
it)//入队
if((rear+2)%size==front)returnfalse;
rear=(rear+1)%size;
listArray[rear]=it;
booldequene(cData&
it)//出队
if(length()==0)returnfalse;
it=listArray[front];
front=(front+1)%size;
virtualintlength()const{return((rear+size)-front+1)%size;
}//队列的实际长度
};
实现程序的具体步骤:
车辆进入:
每进入一辆汽车,进行入栈操作,即进入停车场;
如果入栈不成功,即停车场满,进入便道。
车辆出去:
(1)对输入数据的车牌号与栈顶的车牌号比较,若相等则直接出栈,否则为要出去的车开道。
(2)在该车进行出栈操作后,再将临时栈中的数据弹出并入栈。
(3)将离开时间和进入的时间做差,得出停车时间进行输出,并且算出应该缴纳的费用(1元/h)
(4)若车辆离开后队列不为空,表明便道上有车要进到停车场,修改该车辆的到达时间为离开车的离开时间,并且进行入栈操作。
当输入不为E时,循环进行上述操作。
while(c!
='
E'
)//不退出程序
{
cDatad;
scanf("
%c,%d,%d"
&
c,&
d.number,&
d.ctime);
cDatatop;
if(c=='
A'
)//进入停车场
{if(park.push(d))//入栈成功
cout<
<
"
停在停车场的"
i++<
位置"
endl;
//输出提示语句
}
else//入栈失败
line.enquene(d);
cout<
停车场已满,进入便道"
line.enquene(d);
elseif(c=='
D'
)//离开停车场
{
park.topValue(top);
while(top.number!
=d.number)//为车开道
park.pop(top);
temp.push(top);
停车时间为"
d.ctime-top.ctime<
h"
;
离开停车场,车牌号为"
d.number<
应该收费"
元"
//输出提示语句
i--;
while(temp.length()!
=0)//回到车位
temp.pop(top);
park.push(top);
if(line.length()!
=0)//由便道到车库
line.dequene(top);
top.ctime=d.ctime;
//进入的时间刚好是那辆车出去的时间
算法的时空分析
对于入栈处理,时间复杂度为Θ
(1),对于出栈处理,最坏情况下的时间复杂度是Θ(n)的。
输入N次,出栈处理最多只有N/2次,所以时间复杂度最坏情况是Θ(n2)的,最好情况是Θ(n)的。
停车场没有满,入栈成功,s.push()
函数的调用关系图
车辆进入‘A’
停车场已经满,入栈失败,入队列line.enquene()
主程序退出程序‘E’程序结束
如果离开的车在栈顶,s.pop(),否则后面的车进入临时栈
该车离开s.pop()
临时栈中的车回到停车场s.push(temp.pop())
车辆退出‘D’
便道车入栈s.push(line.dequene())
输入和输出的格式
输入:
2
D,1,5
输出:
停在停车场第1个位置
停在停车场第2个位置
停车场已满,进入便道
停车时间4h离开停车场,车牌号为1应该收费2元
四、测试结果
五、用户使用说明(可选)
1、本程序的运行环境为DOS操作系统,执行文件为停车场管理.exe
2、运行程序时:
输入停车场长度
输入停车数据,按“出入停车场(A,D),车牌,时间”输入。
输出提示信息。
六、实验心得
这次实验比前一次熟练了很多,思路很清晰,以后应该在实验上多花点心思,提高自己的编程和算法分析能力。
七、附录
#include<
iostream>
usingnamespacestd;
classcData//每辆车的信息类
intnumber;
//车牌号码
intctime;
//到达时间
main()
intn;
请输入停车场的长度n:
cin>
>
n;
Stackpark(n);
Stacktemp(n);
Queneline(100);
charc='
inti=1;
system("
pause"
);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场 管理 实验 报告