1、实验报告 停车场管理实验 停车场管理姓名:曹国君 梁辰 唐琪皓 黄悦 班级:信息1班 学号:* * * * 实验时间:第5周1.问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入得车辆必须先退出车场为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按照它停留的时间长
2、短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。2.数据结构设计 由于停车场的停车位有限,只有一个入口,且通道狭长,当停车场内某辆车要离开时,在它之后开入得车辆必须先退出车场为它让路,顺序栈的结构符合停车场的需求。若车场内已停满,车辆再外排队等候,队伍不限长度,可以使用链式队列进行模拟。输入:停车位数,停车费单价,进入或离去,车牌号,进入或离去时间输出:进入:输出停在停车场或者便道上的位置 离去:输出停留在停车场上的时间(离开时间-进入停车场的时间)及费用为了满足以上的要求,至少需要记录进入时间以及车牌号templateclass SqStack protected:/ 顺序栈的数据成
3、员: int top; / 栈顶指针 int maxSize; struct Set /定义一个结构体,可以存放两个数据 ElemType num; ElemType time; ; / 栈最大容量 Set *elems; template struct Node / 数据成员: ElemType data1,data2; / 两个数据域 Node *next; / 指针域/ 构造函数:Node(); / 无参数的构造函数Node(ElemType item1,ElemType item2 ,Node *link = NULL); /已知数数据元素值和指针建立结构;3.程序设计(1)头文件由于
4、数据域的改变,创建,插入,删除等函数都需要增加一个数据域的处理。顺序栈:public:/ 抽象数据类型方法声明及重载编译系统默认方法声明: SqStack(int size = DEFAULT_SIZE); / 构造函数 virtual SqStack(); / 析构函数 int Length() const; / 求栈长度 bool Empty() const; / 判断栈是否为空 void Clear(); / 将栈清空 void Traverse(void (*Visit)(const ElemType &) const; / 遍历栈 Status Push(const ElemType
5、 &e,const ElemType &t); / 入栈 Status Top(ElemType &e,ElemType &t) const; / 取顶元素 Status Pop(ElemType &e,ElemType &e); / 出栈 SqStack(const SqStack ©); / 复制构造函数 SqStack &operator =(const SqStack ©); / 赋值语句重载链式队列:public: LinkQueue(); / 无参数的构造函数 virtual LinkQueue(); / 析构函数 int Length() const; / 求队列
6、长度 bool Empty() const; / 判断队列是否为空 void Clear(); / 将队列清空 void Traverse(void (*Visit)(const ElemType &) const ; / 遍历队列 Status DelQueue(ElemType &e,ElemType &t); / 出队操作 Status GetHead(ElemType &e,ElemType &t) const; / 取队头操作 Status EnQueue(const ElemType &e,const ElemType &t); / 入队操作 LinkQueue(const Lin
7、kQueue ©); / 复制构造函数 LinkQueue &operator =(const LinkQueue ©);/ 赋值语句重载(2)辅助函数 当车辆离开时,输入车牌号与离开时间,如果该车辆在停车场中,则在其之后的车辆需要暂时离开停车场为其让路,返回其进入停车场的时间,并判别为真;如果该车辆不存在停车场中,则判别为假。int depart(const int &a,const int &n,SqStack &p,bool &dans) /返回进入时间 SqStack park1(n); /建立一个临时栈int tmpn,tmpt,count=0,atime,i; do
8、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(int i=0;icount;i+) /让路的车重新返回停车场 park1.Pop(tmpn,tmpt); p.Pus
9、h(tmpn,tmpt); return atime; /返回进入时间 为了避免输入重复的车牌号,输入的离开时间小于进入时间,设计了遍历功能供使用者参考template void SqStack:Traverse(void (*Visit)(const ElemType &) const/ 操作结果:从栈顶到栈底依次对栈的每个元素调用函数(*visit) for (int Pos = top-1; Pos =0 ; Pos-) / 从栈底到栈顶对栈的每个元素调用函数(*visit) cout车牌:; (*Visit)(elemsPos.num); cout到达时间:; (*Visit)(ele
10、msPos.time); coutendl; (3)主程序#includeassistance.h#includesq_stack.h#includelk_queue.hint depart(const int &a,const int &n,SqStack &p,bool &dans) SqStack park1(n);int tmpn,tmpt,count=0,atime,i; dop.Pop(tmpn,tmpt); park1.Push(tmpn,tmpt); count+; while(tmpn!=a&!p.Empty(); if(tmpn=a) dans=1; park1.Pop(t
11、mpn,tmpt); count-; else dans=0; atime=tmpt; for(int i=0;icount;i+) park1.Pop(tmpn,tmpt); p.Push(tmpn,tmpt); return atime; int main() int n=0,time,num,tmp,oldtime; double prix; /停车单价 bool si; /判别车辆是否存在 char jug=P; cout欢 迎 使 用 停 车 场 管 理 系 统endl; while(n1) cout请输入停车场的车位数:n; LinkQueue hallway; SqStack p
12、ark(n); cout请输入每分钟停车费:prix; while(jug!=E) /选择界面 coutA.车辆到达endl; coutD.车辆离开endl; coutL.查看停车场情况endl; /遍历停车场情况 coutE.退出程序jug; switch(jug) case A: /进入 cout请输入车牌号与达到时间: numtime; if(park.Length()!=n) /停车场没满 park.Push(num,time); cout车牌号为 num 的车辆进入停车场时间:time分钟,位置:park.Length()endl; /进入停车场Else /停车场满 hallway.
13、EnQueue(num,time);cout停车场已满,车牌号为 num 的车辆进入停车场外便道时间:time分钟,位置:hallway.Length()endl; /进入便道排队continue; case D: /离开 if(!park.Empty() /停车场有车辆 cout请输入车牌号与离开时间: numtime; oldtime=depart(num,n,park,si); /记录进入时间,判定其存在 if(si) /存在则输出 cout车牌号为 num 的车辆进入停车场时间:oldtime,离开时间为:time停留时间:time-oldtime分钟,费用:(time-oldtime
14、)*prixendl; if(!hallway.Empty() /如果有车辆在便道内等候 hallway.DelQueue(num,tmp); park.Push(num,time); cout车牌号为 num 的车辆进入停车场时间:time分钟,位置:park.Length()endl; /队列的队首进入栈,并输出相关信息 else cout停车场内没有该车辆endl; /输入的车牌号不存在于栈内 else cout停车场内没有任何车辆end /栈为空时,不用输入离开车辆的信息 continue; case L: cout停车场出入口(南)endl; park.Traverse(Write)
15、; /遍历停车场占用的车位 coutendl; continue; cout再 见endl; /程序结束 system(pause); return 0;停车场管理数据测试次数输入输出车位数单价到达离去信息时刻车牌号位置停留时间费用125 A 51车位1 A 102车位2 D 1511050 A 203车位2 A 254便道位1 A 305便道位2 D 35225125 D 404525 E 00220.5 A 51车位1 A 102车位2 A 153便道位1 A 204便道位2 A 255便道位3 D 3022010 A 356便道位3 D 403105 D 4514020 E 00315
16、A 51车位1 A 102便道位1 D 152 A 153便道位2 D 25120100 D 25200 D 3531050 E 00451 A 43车位1 A 72车位2 A 155车位3 D 8344 A 91车位3 A 184车位4 D 2521818 A 306车位4 E 00532.785 A 51车位1 A 52车位2 A 53车位3 A 54便道位1 D 102513.925 D 10400 A 155车位3 D 1511027.85 E 006210 D A 101车位1 A 112车位2A112便道位1 D 22211110 D 33211110 D 44134340 E 0
17、0730.01 A 61车位1 A 802车位2 A 1203车位3 D 1803600.6 A 2504车位3 A 3005便道位1 D 35041001 E 00828 A 361车位1 D 482 D 451972 A 483车位1 A 554车位2 A 555便道位1 D 6031296 E 009102 A 21车位1 A 22车位2 A 43车位3 A 84车位4 D 101816 A 165车位4 D 2021836 E 0010005.测试记录及收获由于时间紧迫,对于车牌重复,到达时间小于离开时间的情况未做进一步的限制,假定输入的车牌不重复,时间的输入依次递增。为了避免以上错误,设计了遍历停车场情况的函数,以此弥补程序的不足。通过本次实验,我们小组进一步熟悉了栈和队列的区别。无论是链式还是顺序,各有优点,灵活地运用这些结构,可以模拟许多常见的情况。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1