数据结构 停车场管理

题目:设停车场内只有一个可停放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;
}

### 停车场管理系统的数据结构设计与分析 #### 使用的数据结构 停车场管理系统的设计通常依赖于特定的数据结构来模拟实际场景中的操作。对于停车场而言,其核心特性之一是只有一个入口/出口,这使得****成为理想的选择用于表示停车场内的车位分配情况[^1]。 当考虑到存在额外的便道允许车辆排队等待进入停车场时,则应采用**队列**这一线性表形式的数据结构来进行建模,因为它遵循先进先出的原则(FIFO),正好匹配了便道上车辆依次等候入场的行为模式[^3]。 为了处理车辆离场过程中可能产生的临时移位需求——即当前准备驶离的车辆前方若有其他车辆阻挡,则这些被阻塞的车辆需暂时移动至一边让路给即将出场者,在这种情况下引入另一个辅助性的****用来暂存那些因避让而短暂停靠在一旁的车辆。 #### 功能模块划分 整个系统大致可分为以下几个功能子模块: - **出入记录维护** - 记录每辆进出停车场的时间戳; - 更新对应位置的状态(空闲或占用); - **费用结算机制** - 根据停留时间长短自动计算应付金额; - **状态查询接口** - 提供实时查看剩余可用停车位数量的功能; - 支持按车牌号检索具体某辆车的位置信息; 以上各部分共同协作完成对停车场日常运营的有效监管和服务提供。 ```cpp // C++ 实现示例片段展示如何定义基本类成员函数以支持上述提到的一些基础业务逻辑 class ParkingLot { private: stack<Car> parkingArea; // 主体停车区模型化为 queue<Car> waitingQueue; // 外部等待车道视为队列 stack<Car> tempStorageStack; // 辅助存储空间同样基于 public: void enter(Car& car); // 进入方法负责安排新到来车辆停泊事宜 bool exit(string plateNum); // 出口处执行离开动作并返回是否成功标志 }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值