数据结构 停车场管理

题目:设停车场内只有一个可停放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表示查询 Q退出程序,第二位为车牌号,第三位为时间

最近刚好研究完STL模板库就把之前做过的题目用STL实现了一下

#include<iostream>
#include<cstdio>
#include<stack>
#include<queue>
using namespace std;


const int N =2; //车场容纳车辆数量

struct CAR{  //存储车辆信息,因为车牌号很小且唯一,因此数组下标和number均表示车牌号
	int number;//如果车牌号为字符或者较长,可以使用MAP进行映射
	int time=-1;//time为-1时表示此车牌的车未进入停车场
}car[1000];

queue <CAR> lane;//建立等待队列
stack <CAR> parking;//建立停车场的栈
stack <CAR> tmp_parking;//该栈用于暂存非栈顶元素

void car_in(int number,int time)//车辆进入
{
	car[number].time = time;
	car[number].number = number;
	if (parking.size() >= N)//判断车场是否满
	{
	printf("The parking is full,%d joins the waiting queue!\n\n",number);
	lane.push(car[number]);//满则将车辆加入队列等待
	return;
	}	
	else
	{
		parking.push(car[number]);
		printf("The %d is parking in No.%d parking space !\n\n",number,parking.size());
	}
}

void car_out(int number, int time)//车辆退出
{
	
	if (parking.empty() == true)
	{
		printf("The parking is empty!\n\n");
		return;
	}	
	if (car[number].time == -1)
	{
	printf("Can't find this car!\n\n");
	return;
	}

	if (parking.top().number == number)//判断退出车辆是否在栈顶
	{
		printf("Time:%d  Pay:$%d\n\n", time - parking.top().time, (time - parking.top().time)*2);//直接退出
		parking.pop();
		car[number].time = -1;
	}
	else
	{
		for (; parking.top().number != number; parking.pop())//将上层元素移至另一个栈
			tmp_parking.push(parking.top());
		printf("Time:%d  Pay:$%d\n\n", time - parking.top().time, (time - parking.top().time)*2);//退出
        parking.pop();
		car[number].time = -1;
		for (; tmp_parking.empty()!=true; tmp_parking.pop())//移回
			parking.push(tmp_parking.top());
	}
	if (lane.empty() == false)//如果队列有车辆在等待
	{
		parking.push(lane.front());//入栈
		printf("The %d is parking in No.%d parking space !\n\n",lane.front().number, parking.size());
		lane.pop();//从队列移除
	}
}
void car_empty()//查询车场情况
{
	if (parking.empty())
		printf("Number of vehicles in parking lot:0\n\n");
	else
		printf("Number of vehicles in parking lot:%d\n\n",parking.size());
}

int main()
{
	
	int time, number;
	char op;
	index:
	scanf("%c%d%d", &op, &number, &time);
	if (op == 'A')
		car_in(number,time);
	else if (op == 'D')
		car_out(number, time);
	else if (op =='E')
		car_empty();

	if (op != 'Q')//循环
		goto index;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值