内容仅供个人复习
*设停车场内只有一个的停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车
在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第
一辆车停放在车场的最北端),若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道
上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,
在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序
进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为
停车场编制按上述要求进行管理的模拟程序。
[测试数据]
设 n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),
(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟
管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到
达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车
在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳
的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存
储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数
据项:汽车的牌照号码和进入停车场的时刻。
*
#include<iostream>
#define MAXSIZE 100
using namespace std;
//收费标准每小时2元
int n;
int cnt;//计数器
typedef struct Car
{int num;int arr = 0;
}Car;typedef struct Stack
{Car *top;Car *base;int stacksize;}SqStack;typedef struct
{Car *bear;int front;int rear;
}SqQueue;SqStack s;SqStack s1; SqQueue Q;void Init(SqStack &s)
{s.stacksize = MAXSIZE;s.top = new Car[MAXSIZE];s.base = s.top;
}
void Init2(SqQueue &Q)
{Q.bear = new Car[MAXSIZE];Q.front = Q.rear = 0;
}void Push(SqStack &s , int number , int time) // 车进停车场
{s.top++;cout<<"停车位置:"<<cnt<<'\n';s.top ->num = number;s.top ->arr = time;
}void Push_Queue(SqQueue &Q , int number , int time) //停车位不够,进入队列
{if((Q.rear + 1 ) % MAXSIZE == Q.front) {cout<<"队满"<<'\n';return ;}Q.bear[Q.rear].num = number;Q.bear[Q.rear].arr = time;Q.rear = (Q.rear + 1) % MAXSIZE;}
void Pop_Queue(SqQueue &Q , int time)//从队列中进入停车场
{ if(Q.front == Q.rear) return;//空队列,表示外面没有等待的车辆 s.top++;*s.top = Q.bear[Q.front];s.top->arr = time;Q.front = (Q.front + 1) % MAXSIZE;}void push_2(Car &c)//外面的车出去让里面的车走,进入中转栈
{s1.top++;*s1.top = c;
}void Pop_2( SqStack &s1 , SqStack &s)//从中转站进入停车场
{while(s1.top != s1.base){s.top++;*s.top = *s1.top;s1.top--;}}void Pop(SqStack &s , int number , int time)//出停车场
{cnt--;int flag = 0;while(s.top ->num != number){flag = 1;push_2(*s.top);s.top--; }cout<<"时间:"<<time - s.top ->arr<<" 费用:"<<(time - s.top ->arr) * 2<<'\n';s.top--;if(flag) Pop_2(s1,s);Pop_Queue(Q,time);}int main()
{Init(s);Init(s1);Init2(Q);cout<<"输入总车辆数:"<<'\n';cin>>n;//表示车辆总数char op;int number;int time;while(1){cin>>op>>number>>time;if(op == 'E') break;if(op == 'A') cnt++;if(cnt > n)// 满了 加进队列里 {if(op == 'A'){cout<<"进入队列"<<'\n';Push_Queue(Q,number,time);}else if(op == 'D'){Pop(s,number,time);} }else{if(op == 'A'){Push(s,number,time);}else if(op == 'D'){Pop(s,number,time);} }}return 0;
}