实验报告 停车场管理Word文档下载推荐.docx
《实验报告 停车场管理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验报告 停车场管理Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
};
//栈最大容量
Set*elems;
}
template<
structNode
{
//数据成员:
ElemTypedata1,data2;
//两个数据域
Node<
ElemType>
*next;
//指针域
//构造函数:
Node();
//无参数的构造函数
Node(ElemTypeitem1,ElemTypeitem2,Node<
*link=NULL);
//已知数数据元素值和指针建立结构
};
3.程序设计
(1)头文件
由于数据域的改变,创建,插入,删除等函数都需要增加一个数据域的处理。
顺序栈:
public:
//抽象数据类型方法声明及重载编译系统默认方法声明:
SqStack(intsize=DEFAULT_SIZE);
//构造函数
virtual~SqStack();
//析构函数
intLength()const;
//求栈长度
boolEmpty()const;
//判断栈是否为空
voidClear();
//将栈清空
voidTraverse(void(*Visit)(constElemType&
))const;
//遍历栈
StatusPush(constElemType&
e,constElemType&
t);
//入栈
StatusTop(ElemType&
e,ElemType&
t)const;
//取顶元素
StatusPop(ElemType&
e);
//出栈
SqStack(constSqStack<
&
copy);
//复制构造函数
SqStack<
operator=(constSqStack<
//赋值语句重载
链式队列:
LinkQueue();
//无参数的构造函数
virtual~LinkQueue();
//析构函数
//求队列长度
//判断队列是否为空
//将队列清空
))const;
//遍历队列
StatusDelQueue(ElemType&
//出队操作
StatusGetHead(ElemType&
//取队头操作
StatusEnQueue(constElemType&
//入队操作
LinkQueue(constLinkQueue<
//复制构造函数
LinkQueue<
operator=(constLinkQueue<
//赋值语句重载
(2)辅助函数
当车辆离开时,输入车牌号与离开时间,如果该车辆在停车场中,则在其之后的车辆需要暂时离开停车场为其让路,返回其进入停车场的时间,并判别为真;
如果该车辆不存在停车场中,则判别为假。
intdepart(constint&
a,constint&
n,SqStack<
int>
p,bool&
dans)//返回进入时间
{SqStack<
park1(n);
//建立一个临时栈
inttmpn,tmpt,count=0,atime,i;
do{p.Pop(tmpn,tmpt);
park1.Push(tmpn,tmpt);
count++;
}//计数器用来记录让开的车数
while(tmpn!
=a&
&
!
p.Empty());
//如果栈顶车牌不符合条件,而且栈不为空,把栈顶元素弹出后放入临时栈中
if(tmpn==a)//如果找到了该车
{dans=1;
//判别为真
park1.Pop(tmpn,tmpt);
//该车辆离开
count--;
}
else
{dans=0;
}//如果遍历仍找不到车,则判别为假
atime=tmpt;
for(inti=0;
i<
count;
i++)//让路的车重新返回停车场
{park1.Pop(tmpn,tmpt);
p.Push(tmpn,tmpt);
}
returnatime;
//返回进入时间
为了避免输入重复的车牌号,输入的离开时间小于进入时间,设计了遍历功能供使用者参考
voidSqStack<
:
Traverse(void(*Visit)(constElemType&
))const
//操作结果:
从栈顶到栈底依次对栈的每个元素调用函数(*visit)
for(intPos=top-1;
Pos>
=0;
Pos--)//从栈底到栈顶对栈的每个元素调用函数(*visit)
{cout<
<
"
车牌:
;
(*Visit)(elems[Pos].num);
cout<
到达时间:
(*Visit)(elems[Pos].time);
endl;
(3)主程序
#include"
assistance.h"
sq_stack.h"
lk_queue.h"
dans)
if(tmpn==a)
i++)
intmain(){
intn=0,time,num,tmp,oldtime;
doubleprix;
//停车单价
boolsi;
//判别车辆是否存在
charjug='
P'
欢迎使用停车场管理系统"
while(n<
1)
{
请输入停车场的车位数:
cin>
>
n;
}
hallway;
park(n);
请输入每分钟停车费:
prix;
while(jug!
='
E'
)//选择界面
A.车辆到达"
D.车辆离开"
L.查看停车场情况"
//遍历停车场情况
E.退出程序"
jug;
switch(jug){
case'
A'
//进入
请输入车牌号与达到时间:
"
num>
time;
if(park.Length()!
=n)//停车场没满
{park.Push(num,time);
车牌号为"
num<
的车辆进入停车场时间:
time<
分钟,位置:
park.Length()<
}//进入停车场
Else//停车场满
{hallway.EnQueue(num,time);
cout<
停车场已满,车牌号为"
的车辆进入停车场外便道时间:
hallway.Length()<
//进入便道排队
continue;
D'
//离开
{if(!
park.Empty())//停车场有车辆
请输入车牌号与离开时间:
oldtime=depart(num,n,park,si);
//记录进入时间,判定其存在
if(si){//存在则输出
oldtime<
,离开时间为:
停留时间:
time-oldtime<
分钟,费用:
(time-oldtime)*prix<
if(!
hallway.Empty())//如果有车辆在便道内等候
{hallway.DelQueue(num,tmp);
park.Push(num,time);
分钟,位置:
//队列的队首进入栈,并输出相关信息
elsecout<
停车场内没有该车辆"
}//输入的车牌号不存在于栈内
停车场内没有任何车辆"
end//栈为空时,不用输入离开车辆的信息
continue;
case'
L'
停车场出入口(南)"
park.Traverse(Write<
);
//遍历停车场占用的车位
}}}
再见"
//程序结束
system("
pause"
return0;
停车场管理数据测试
次数
输入
输出
车位数
单价
到达离去信息
时刻
车牌号
位置
停留时间
费用
1
2
5
A
车位1
10
车位2
D
15
50
20
3
25
4
便道位1
30
便道位2
35
125
40
E
0.5
便道位3
6
45
100
7
车位3
8
9
18
车位4
2.785
13.925
27.85
11
A
22
110
33
44
34
340
0.01
80
120
180
60
0.6
250
300
350
36
48
72
55
12
96
16
5.测试记录及收获
由于时间紧迫,对于车牌重复,到达时间小于离开时间的情况未做进一步的限制,假定输入的车牌不重复,时间的输入依次递增。
为了避免以上错误,设计了遍历停车场情况的函数,以此弥补程序的不足。
通过本次实验,我们小组进一步熟悉了栈和队列的区别。
无论是链式还是顺序,各有优点,灵活地运用这些结构,可以模拟许多常见的情况。