用栈和队列实现虚拟停车场系统

简介: 学校的数据结构课程实验之一。 用到的数据结构:栈、队列 需求分析   设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序依次排列。   若车场内已停满n辆汽车,则后来的汽车只能在门外便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,该车开出后,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开时必须按它停留的时间长短交纳费用。

学校的数据结构课程实验之一。

用到的数据结构:栈、队列

需求分析

  设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序依次排列。

  若车场内已停满n辆汽车,则后来的汽车只能在门外便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,该车开出后,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开时必须按它停留的时间长短交纳费用。

 

数据要求

  要求模拟停车场车辆的管理,按照从终端读入的输入数据序列进行模拟管理。

  每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。

主函数流程图

主函数:

 1 #include <iostream>
 2 #include <string>
 3 #include "Stack.h"
 4 #include "Queue.h"
 5 #include "Time.h"
 6 #include "Parking.h"
 7 using namespace std;
 8 int main()
 9 {
10     Parking parking;
11     cout<<"输入示例"<<endl<<"到达:A 京C001 9:40"<<endl<<"离开:D 京B984 10:25";
12     char choice='y';
13     while(choice == 'y')
14     {
15         cout<<endl<<"请输入事件:"<<endl;
16         fflush(stdin);
17         char action;
18         string num;
19         Time timing;
20         cin>>action>>num>>timing;//读入事件
21         if(action == 'A')
22         {
23             parking.park(num, timing);
24         }
25         else if(action == 'D')
26         {
27             parking.leave(num,timing);
28         }
29         cout<<endl<<"继续吗[y/n]?";
30         cin>>choice;
31     }
32     return 0;
33 }

栈类模板(数组实现,同样参考了经典教材"Data Structures and Program Design in C++" Robert L. Kruse, Alexander J. Ryba 高等教育出版社-影印版)

 1 const int maxStack=3;//最多元素个数
 2 enum Error_code
 3 {
 4     success, underflow, overflow
 5 };
 6 
 7 template <class Stack_entry>
 8 class Stack
 9 {
10 private:
11     unsigned int count;//记录栈内元素个数
12     Stack_entry entry[maxStack];//数组实现
13 public:
14     Stack()
15     {
16         count=0;
17     }
18     bool empty() const
19     {
20         if(count==0) return true;
21         else return false;
22     }
23     bool full() const
24     {
25         if(count==maxStack) return true;
26         else return false;
27     }
28     Error_code pop()
29     {
30         if(count==0) return underflow;
31         else
32         {
33             --count;
34             return success;
35         }
36     }
37     Error_code top(Stack_entry &item) const//取栈顶元素
38     {
39         if(count==0) return underflow;
40         else
41         {
42             item=entry[count-1];
43             return success;
44         }
45     }
46     Error_code push(Stack_entry &item)
47     {
48         if(count >= maxStack) return overflow;
49         else
50         {
51             entry[count++]=item;
52             item.position = count;//返回停车位置,从1开始记
53             return success;
54         }
55     }
56 };
Stack.h

队列类模板(链表实现,同样参考了经典教材"Data Structures and Program Design in C++" Robert L. Kruse, Alexander J. Ryba 高等教育出版社-影印版)

 1 template<class Node_entry>//链队列结点定义(单链表)
 2 struct Node
 3 {
 4     //数据成员
 5     Node_entry entry;
 6     Node<Node_entry> *next;
 7 
 8     //构造函数
 9     Node(){}
10     Node(Node_entry new_entry, Node<Node_entry> *new_next=NULL)
11     :entry(new_entry), next(new_next){}
12 };
13 
14 template<class Queue_entry>
15 class Queue
16 {
17 public:
18     unsigned int count;//结点个数
19     Node<Queue_entry> *front, *rear;//队列头、尾结点
20 
21     Queue()//构造函数
22     {
23         count=0;
24         front=rear=NULL;
25     }
26     bool empty() const
27     {
28         if(count==0) return true;
29         else return false;
30     }
31     Error_code serve()
32     {
33         if(count==0) return underflow;
34         else
35         {
36             Node<Queue_entry> *out=front;
37             front=front->next;
38             if(front==NULL) rear=NULL;
39             delete out;
40             count--;
41             return success;
42         }
43     }
44     Error_code retrieve(Queue_entry &item) const//取队列头元素
45     {
46         if(count==0) return underflow;
47         else
48         {
49             item=front->entry;//解引用
50             return success;
51         }
52     }
53     Error_code append(const Queue_entry &item)
54     {
55         Node<Queue_entry> *in=new Node<Queue_entry>(item);
56         if(in==NULL) return overflow;
57         if (count == 0)
58         {
59             front=rear=in;
60         }    
61         else
62         {
63             rear->next=in;
64             rear=in;;
65         }
66         count++;
67         return success;
68     }
69 };
Queue.h

时间类(为停车场计时而设计)

 1 #include <iostream>
 2 using namespace std;
 3 class Time
 4 {
 5 private:
 6     unsigned short hour;
 7     unsigned short minute;
 8 public:
 9     Time(){ hour = 0; minute = 0; }//默认构造函数
10     Time(unsigned short h, unsigned short m):hour(h),minute(m){}//构造函数
11     int HowManyMinutes(const Time &time)//计算时间间隔
12     {
13         return time-*this;
14     }
15     Time& operator=(const Time &t)
16     {
17         hour = t.hour;
18         minute = t.minute;
19         return *this;
20     }
21     friend int operator-(const Time &t1, const Time &t2);//重载相减运算符
22     friend istream &operator>>(istream &is, Time &t);
23     friend ostream &operator<<(ostream &os, Time &t);
24 };
25 
26 int operator-(const Time &t1, const Time &t2)//重载相减运算符
27     {
28         int dur=0;
29         if(t1.minute < t2.minute)
30         {
31             dur = t1.minute+60-t2.minute;
32             dur += 60*(t1.hour-1-t2.hour);
33         }
34         else
35         {
36             dur = t1.minute - t2.minute;
37             dur += 60*(t1.hour - t2.hour);
38         }
39         return dur;
40     }
41 istream &operator>>(istream &is, Time &t)
42 {
43     char sem;
44     is >> t.hour >> sem >> t.minute;
45     return is;
46 }
47 ostream &operator<<(ostream &os, Time &t)//此处不能加const
48 {
49     os << t.hour << ':' << t.minute;
50     return os;
51 }
Time.h

汽车离开、到达的流程图

汽车类

 1 struct Car
 2 {
 3     string num;//车牌号
 4     Time arrTime;//到达时间(未必立即停入车位)
 5     Time inTime;//停入车位的时间
 6     short position;//停入的车位,0为便道,栈底为1
 7     Time depTime;//离开时间
 8     //构造函数
 9     Car(){}
10     Car(string n, Time a):num(n),arrTime(a){}
11     void CheckOut()//离开时的结算
12     {
13         cout<<"停留时间为"<<depTime - arrTime<<"分钟"<<endl;//停留时间
14         cout << "到达时间" << arrTime << endl;
15         cout << "离开时间" << depTime << endl;
16         cout << "停入时间" << inTime << endl;
17         cout << "应交纳停车费 " << (depTime - inTime) * 2 << "";
18     }
19     void CheckIn()
20     {
21         cout << "到达时间为" << arrTime << endl;
22         cout << "进入停车场时间为" << inTime<<endl;
23         cout << "停入的位置为#" << position;
24     }
25 };

停车场类

 1 enum Status
 2 {
 3     succeed, fail
 4 };
 5 
 6 class Parking
 7 {
 8 private:
 9     Stack<Car> parkStack;//停车栈
10     Stack<Car> tempStack;//临时栈
11     Queue<Car> waitingQueue;//便道
12 public:
13     Status park(string num, Time arr)
14     {
15         Car *new_car = new Car(num, arr);
16         if (parkStack.full())//栈满,入便道
17         {
18             waitingQueue.append(*new_car);
19             new_car->position = 0;
20             cout << "停车场已满,进入便道";
21         }
22         else//栈未满,入栈
23         {
24             new_car->inTime = arr;//到达即入栈
25             parkStack.push(*new_car);
26             new_car->CheckIn();
27         }
28         return succeed;
29     }
30     Status leave(string num, Time dep)
31     {
32         Car *currentCar= new Car();
33         parkStack.top(*currentCar);
34         while(currentCar->num != num)//遍历栈以找到要离开的车
35         {
36             tempStack.push(*currentCar);//前面的车退出到临时栈
37             parkStack.pop();
38             parkStack.top(*currentCar);
39         }
40         //找到了要离开的那辆车
41         currentCar->depTime = dep;//登记离开时间
42         currentCar->CheckOut();//结账,打印账单
43         parkStack.pop();//该车出栈
44         //临时栈中的车依次放回停车栈
45         while (!tempStack.empty())
46         {
47             tempStack.top(*currentCar);
48             parkStack.push(*currentCar);
49             tempStack.pop();
50         }
51         if(!waitingQueue.empty())//便道不空,队头入栈
52         {
53             waitingQueue.retrieve(*currentCar);
54             waitingQueue.serve();
55             parkStack.push(*currentCar);
56             currentCar->inTime = dep;//上一辆车离开的时间就是这一辆的入栈时间
57             cout <<endl<< "车辆" << currentCar->num << "已从便道开入停车场" << endl;
58             currentCar->CheckIn();
59         }
60         return succeed;    
61     }
62 };

测试结果

 

目录
相关文章
|
11天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
29 0
【队列】数据结构队列的实现
【队列】数据结构队列的实现
|
1月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现
|
1月前
|
存储
数据结构--栈和队列
数据结构--栈和队列
|
12天前
|
存储 算法 索引
【算法与数据结构】队列的实现详解
【算法与数据结构】队列的实现详解
|
16天前
|
算法 C语言
【算法与数据结构】 C语言实现单链表队列详解2
【算法与数据结构】 C语言实现单链表队列详解
|
16天前
|
存储 算法 C语言
【算法与数据结构】 C语言实现单链表队列详解1
【算法与数据结构】 C语言实现单链表队列详解
|
16天前
|
存储 算法 编译器
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
|
20天前
|
存储
【数据结构】什么是栈?
【数据结构】什么是栈?
24 0
【数据结构】什么是栈?
|
24天前
|
存储 设计模式 算法
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
52 0

热门文章

最新文章