c++栈和队列的应用(停车问题)

题目

设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入停车场;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场;每辆停放在车场的车在它离开停车场时,必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

Input

输入数据的第一行包含两个正整数n和m(n,m<=10)分别表示停车场的容量和每小时停车费用。从第2行开始,每行表示一组输入数据,由三项内容构成:(i) 一个大写英文字母,表示汽车“到达”或“离开”信息,输入'A'时,表示汽车达到,输入'D'时,表示汽车离开,输入'E'时,表示程序结束;(ii) 一个正整数X,表示汽车牌照号;(iii) 一个正整数T,表示汽车到达或离开的时刻。这三项内容之间以一个空格间隔。

Output

对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离开,则输出汽车在停车场内停留的时间(单位是小时)和应交纳的费用(在便道上停留的时间不收费),假设停车费为每小时m元。具体分为如下几种情况:
(1)如果汽车X到达,且停车场未满,则输出如下信息:“汽车X停靠在停车场Y号位置”(其中:X为汽车牌照号,Y为停车场车位序号,1≤Y≤n)
(2)如果汽车X到达,但停车场已满,则输出如下信息:“汽车X停靠在便道的Z号位置”(其中:X为汽车牌照号,Z为便道的车位序号,1≤Z)
(3)如果汽车X离开,且X在停车场内,则输出如下信息:“汽车X停车H小时,缴纳停车费M元”(其中:X为汽车牌照号,H为停车时间,M为停车费用)
(3.1)如果此时便道上的停车队列不为空,则将便道上的第一辆汽车停入停车场,并输出如下信息:“汽车X停靠在停车场Y号位置”(其中:X为汽车牌照号,Y为停车场车位序号,1≤Y≤n)
(4)如果汽车X离开,但停车场没有牌照X的汽车,则输出如下信息:“汽车X不在停车场”(其中:X为汽车牌照号)

 

#include<iostream>
using namespace std;
int n=0, m=0;
char ch; int temp_num; int temp_time;
class Node
{
	int num;
	int time;
	Node* next;
public:
	Node()
	{
		num = 0;
		time = 0;
		next = NULL;
	}
	Node(int x,int y)
	{
		num = x;
		time = y;
		next = NULL;
	}
	friend class Stack;
	friend class Queue;
	friend void solve();
	Node operator=(const Node& p)
	{
		this->num = p.num;
		this->time = p.time;
		this->next = p.next;
		return *this;
	}
};
class Stack
{
	Node* head;
	int size;
public:
	friend void solve();
	Stack()
	{
	    head = new Node;
		size = 0;
	}
	void Push(int x,int y)  //入栈
	{
		Node* s = new Node(x, y);
		s->next = head->next;
		head->next = s;
		size++;
	}
	void Pop()    //出栈
	{
		if (size == 0)
			return;
		Node* p = head->next;
		head->next= head->next->next;
		delete p;
		size--;
	}
	Node Top()
	{
		Node p;
		if (size == 0)
			return p;
		p = *(head->next);
		return p;
	}
	int get_length()
	{
		return size;
	}
	bool Exist(int x)
	{
		Node* p = head->next;
		while (p)
		{
			if (p->num == x)
				return true;
			p = p->next;
		}
		return false;
	}
};
class Queue
{
	Node* head;
	Node* rear;
	int size;
public:
	friend void solve();
	Queue()
	{
		rear = head = new Node;
		size = 0;
	}
	bool Exist(int x)
	{
		Node* p = head->next;
		while (p)
		{
			if(p->num == x)
			   return true;
			p = p->next;
		}
		return false;
	}
	void Enter(int x,int y)   //入队
	{
		Node* s = new Node(x,y);
		rear->next = s;
		rear = rear->next;
		size++;
	}
	void Leave()     //出队
	{
		if (size == 0)
			return;
		Node* p = head->next;
		head->next = head->next->next;
		delete p;
		size--;
	}
	Node Front()
	{
		Node p;
		if (size == 0)
			return p;
		p = *(head->next);
		return p;
	}
	int get_length()
	{
		return size;
	}
};
void solve()
{
	Stack s; //停车场
	Stack t; //临时停车场
	Queue q; //便道
	cin >> n >> m;
	while (cin >> ch && ch != 'E')
	{
		cin >> temp_num >> temp_time;

		if (ch == 'A')//进入
		{
			if (s.get_length() < n) //进入停车场
			{
				s.Push(temp_num, temp_time);
				cout << "汽车" << temp_num << "停靠在停车场" << s.get_length() << "号位置" << endl;
			}
			else //进入便道
			{
				q.Enter(temp_num, temp_time);
				cout << "汽车" << temp_num << "停靠在便道的" << q.get_length() << "号位置" << endl;
			}
		}
		else if (ch == 'D')//离开
		{
			int time = 0; int flag = 0;
			if (!s.Exist(temp_num))//该车不在停车场中
			{
				cout << "汽车" << temp_num << "不在停车场" << endl;
				while (q.Front().num != temp_num && q.Exist(temp_num))
				{

					q.Enter(q.Front().num, q.Front().time);
					q.Leave();
				}
				if (q.Front().num == temp_num)
				{
					q.Enter(q.Front().num, q.Front().time);
					q.Leave();
				}
			}
			else //该车在停车场中
			{
				while (s.Exist(temp_num) && s.get_length() != 0)
				{
					if (s.Top().num != temp_num)
					{
						t.Push(s.Top().num, s.Top().time);//出s栈,入t栈
						s.Pop();
					}
					else
					{
						time = temp_time - s.Top().time;
						cout << "汽车" << s.Top().num << "停车" << time << "小时,缴纳停车费" << time * m << "元" << endl;
						s.Pop();
						flag = 1;
						break;
					}
				}
				while (t.get_length() != 0)    //压回s栈
				{
					s.Push(t.Top().num, t.Top().time);
					t.Pop();
				}
				if (q.get_length() != 0 && flag == 1) //便道汽车进停车场
				{
					s.Push(q.Front().num, temp_time);//进入停车场
					q.Leave();                       //便道上离开
					cout << "汽车" << s.Top().num << "停靠在停车场" << s.get_length() << "号位置" << endl;
				}
			}
		}
	}
}
int main()
{
	solve();
}

测试用例

Sample Input

4 5
A 1 10
A 2 15
A 3 16
D 4 17
D 3 20
A 4 21
A 5 22
A 6 23
A 7 24
A 8 25
D 3 25
D 4 25
D 5 26
A 9 26
A 10 27
A 11 28
A 12 29
A 13 30
D 13 35
D 1 36
D 2 37
D 3 38
D 4 38
D 5 38
D 6 38
D 7 39
D 8 40
D 9 41
D 10 44
D 11 46
D 12 50
D 13 60
D 14 70
E

Sample Output

汽车1停靠在停车场1号位置
汽车2停靠在停车场2号位置
汽车3停靠在停车场3号位置
汽车4不在停车场
汽车3停车4小时,缴纳停车费20元
汽车4停靠在停车场3号位置
汽车5停靠在停车场4号位置
汽车6停靠在便道的1号位置
汽车7停靠在便道的2号位置
汽车8停靠在便道的3号位置
汽车3不在停车场
汽车4停车4小时,缴纳停车费20元
汽车6停靠在停车场4号位置
汽车5停车4小时,缴纳停车费20元
汽车7停靠在停车场4号位置
汽车9停靠在便道的2号位置
汽车10停靠在便道的3号位置
汽车11停靠在便道的4号位置
汽车12停靠在便道的5号位置
汽车13停靠在便道的6号位置
汽车13不在停车场
汽车1停车26小时,缴纳停车费130元
汽车8停靠在停车场4号位置
汽车2停车22小时,缴纳停车费110元
汽车9停靠在停车场4号位置
汽车3不在停车场
汽车4不在停车场
汽车5不在停车场
汽车6停车13小时,缴纳停车费65元
汽车10停靠在停车场4号位置
汽车7停车13小时,缴纳停车费65元
汽车11停靠在停车场4号位置
汽车8停车4小时,缴纳停车费20元
汽车12停靠在停车场4号位置
汽车9停车4小时,缴纳停车费20元
汽车13停靠在停车场4号位置
汽车10停车6小时,缴纳停车费30元
汽车11停车7小时,缴纳停车费35元
汽车12停车10小时,缴纳停车费50元
汽车13停车19小时,缴纳停车费95元
汽车14不在停车场

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值