C++停车场问题

8 篇文章 3 订阅
3 篇文章 0 订阅
本文介绍了一个基于栈和队列实现的停车场管理系统,包括车辆进出管理、费用计算和车位分配。系统使用两个栈和一个链表队列,分别模拟停车场、便道和让路车辆,确保操作符合实际逻辑。程序能输出车辆的停车位置和离开时的费用信息。
摘要由CSDN通过智能技术生成

1、项目简介

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

2、设计思路

停车场的管理流程如下:

        ①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。

        ②当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。

3、数据结构

        由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。因此,本题求解过程中需用到两个栈和一个队列。栈以顺序结构实现,队列以链表结构实现。

4、代码事例

#include <iostream>
#include <cstdio>
#include <time.h>
#include <string.h>
#include <time.h>
#define N 2//停车场最大容量

using namespace std;

typedef struct car
{
	string plate_num; //车牌号
	string stat;//“到达” / “离去”		
	string start_time;//“到达时间”
	string end_time;//“离去时间”
	int in_sec; 
	int out_sec;
	struct car *next;
}Car;

class Time
{
	public:	
		Time()
		{
			//初始化时间:获取系统时间 
			time_t t;
			time(&t);
			struct tm *p = localtime(&t); 
			hour = p->tm_hour;
			min = p->tm_min;
			sec = p->tm_sec;
			time_sec = time(&t);
		}
		
		~Time(){}
		
	public:
		int hour;
		int min;
		int sec;
		int time_sec;
};

class Away//让路车辆(栈)
{
	public:
		Away()
		{
			cout << "让路车辆栈构造" << endl;
		}
	
		~Away()
		{
			cout << "让路车辆栈析构" << pos << endl;
		}
		
		void print()
		{
			int i = 0;
			while(i <= pos)
			{
				cout << "让路:car[" << i << "] = " << car[i] << endl;
				i++;
			}
		}
		
		int car_in(string plate_num)//尾插 
		{
			if(++pos < N)
			{
				car[pos] = plate_num;
				return 1;//让路成功 
			}
			else
			{
				cout << "让路失败" << endl;
				pos--;
				return 0;//让路失败 
			}
		}
		
		string car_out()//头出 
		{
			int i = 0;
			string tmp;
			
			if(pos >= 0)
			{
				tmp = car[0];
				
				while(i < pos)
				{
					car[i] = car[i+1];
					i++;
				}
				
				return tmp;
			}
			else
			{
				return NULL;
			}
		}
		
		int len()
		{
			int len = pos;
			return len+1;
		}
		
		void clear()//初始化 
		{
			pos = -1;
			int i = 0;
			while(i < N)
			{
				car[i] = "NULL";
				i++;
			} 
		}
		
	private:
		string	car[N];
		int pos = -1;
};


class Sidewalk	//场外的车辆(链表)
{
	public:
		Sidewalk()//创建头节点 
		{
			head = new Car;
			if(NULL == head)
			{
				cout << "链表头创建失败" << endl;
			}
			head->plate_num = "NULL";
			head->stat = "NULL";
			head->start_time = "NULL"; 
			head->end_time = "NULL";
			head->next = NULL;
			
			cout << "创建便道队列" << endl;
		}
		
		~Sidewalk()//删除头结点 
		{
			delete head;
			cout << "销毁便道队列" << endl;
		}
		
		int empty()//判空 
		{
			if(head->next == NULL)
			{
				cout << "暂无等待车辆" << endl;
				return 1;
			}
			return 0;
		}
		
		void print()//打印链表 
		{
			if(empty() == 1)
			{
				return;
			}
			
			Car *p = head->next;
			while(p->next != NULL)
			{
				cout << "等待进入:" << p->plate_num << endl;
				p = p->next;
			}
			cout << "等待进入:" << p->plate_num << endl;
			return;
		}
		
		int car_in(string plate_num)//头插法 
		{
			Car *new_car = new Car;
			if(NULL == new_car)
			{
				cout << plate_num <<"插入失败" << endl;
				return -1;
			}
			
			new_car->plate_num = plate_num;
			new_car->stat = "NULL";
			new_car->start_time = "NULL";
			new_car->start_time = "NULL";
			
			new_car->next = head->next;
			head->next = new_car;
			
			//cout << "插入数据成功" << endl;
			return 0; 
		}
		
		string car_out()//尾出 
		{
			if(empty() == 1)
			{
				return "NULL";
			}
			
			Car *p = head->next;
			Car *q;
			while(p->next != NULL)
			{
				q = p;
				p = p->next;
			}
			
			q->next = NULL;
			
			string str = p->plate_num;
			
			delete p;
			
			cout << "str = " << str << endl;

			return str;
		}
		
	
	public:
		Car *head; 
		
};


class Park//停车场内部车辆(栈)
{
	public:
		Park()
		{
			cout << "创建停车场" << endl;
		}
	
		~Park()
		{
			cout << "摧毁停车场" << endl;
		}
		
		void print()
		{
			int i = pos;

			while(i != -1)
			{
				cout << "car[" << i << "] = " << car[i].plate_num << endl;
				i--;
			}
		}
		
		int car_in(Car &car_l, Sidewalk &side)//尾插 
		{
			if(++pos < N)
			{
				car[pos].plate_num = car_l.plate_num;
				car[pos].start_time = car_l.start_time;
				car[pos].end_time = car_l.end_time;
				car[pos].stat = "进站";
				
				cout << "车牌号为:" <<car[pos].plate_num << " 的车主" << "于 " << car[pos].start_time << car[pos].stat << "  车位为:" << pos << "号车位" << endl; 
				
				return 1;//进入停车场成功
			}
			else
			{
				cout << "停车场已满" << endl;
				side.car_in(car_l.plate_num); 
				side.print();
				pos--;
				return 0;//进入停车场失败
			}
		}
		
		int car_out(Car &car_l, Sidewalk &side, Away &away)//头出 
		{
			int i = -1;
			int num;
			
			while(i <= pos)
			{
				if(car[i].plate_num == car_l.plate_num)
				{
					//cout << car[i].plate_num << endl;
					//cout << car[i] << endl;
					num = i;
					break;
				}	
				
				if(i == pos)
				{
					cout << "没有这辆车" << endl;
					return 0;
				}	
				i++; 
			}
		
			
			i = num + 1;
			away.clear();
			while(i<=pos)
			{
				away.car_in(car[i].plate_num);//让路车辆 
				i++;
			} 
			
			if(num > -1)
			{
				cout << "车牌号为" << car[num].plate_num << "的车主于" << car_l.end_time << "出站" << "  车位为:" << pos << "号车位" << endl; 
				car[num].plate_num = "NULL";
				car[num].start_time = "NULL";
				car[num].end_time = "NULL";
				car[num].stat = "NULL";
				pos--; 
			}
			else
			{
				cout << "车牌号为" << car[num].plate_num << "的车主于" << car_l.end_time << "出站" << "  车位为:" << pos << "号车位" << endl; 
			}
			//print();
			
			int len = away.len();
			//cout << "让路车辆数量:" <<len << endl;
			//cout << "num = " << num << endl;
			
			while(len > 0)
			{
				car[num].plate_num = away.car_out();
				num++;
				len--;
			}
			
			//cout << "num = " << num << endl;
			while(num <= pos)
			{
				car[num].plate_num = "NULL";
				num++;
			}
			
			//cout << "pos = " << pos << endl;
			//print();
				
			pos++;
			
			while(1)
			{
				if(pos >= N)
				{
					--pos;
					//cout << "停车场已满" << endl;
					break;
				}
				
				if(side.empty() == 1)
				{
					break;
				}
				string out;
				out = side.car_out();
				cout << "准备进入:" << out << endl;
				
				if(out == "NULL")
				{
					break;
				}
				
				Car car1;
				Time time;
				car1.plate_num = out;
				car1.start_time = to_string(time.hour) + "时" + to_string(time.min) + "分"; 
				
				car[pos].plate_num = car1.plate_num;
				car[pos].start_time = car1.start_time;
				car[pos].end_time = car1.end_time;
				car[pos].stat = "进站";
				
				cout << "车牌号为:" <<car[pos].plate_num << " 的车主" << "于 " << car[pos].start_time << car[pos].stat << endl; 
				pos++;
				
			}
			
			return 0;		 
		}
		
		double money(Car &car_l)
		{
			int hour, min;
			double money; 

			cout << car_l.start_time << endl;
			
			Time time;
			hour = time.hour;
			min = time.min;
			car_l.out_sec = time.time_sec;
			
			car_l.end_time = to_string(time.hour) + "时" + to_string(time.min) + "分" + to_string(time.sec) + "秒"; 
			
			cout << car_l.end_time << endl;
			
			//cout << "进入:" << car_l.in_sec << endl;
			//cout << "出去:" << car_l.out_sec << endl;

			money = (car_l.out_sec - car_l.in_sec);

			return money; 
		}

		
	private:
		Car	car[N];
		int pos = -1;
};



void menu()
{
	cout << "*********************************************************\n";
	cout << "*                                                       *\n";
	cout << "*                  欢迎来龙卷风摧毁停车场               *\n";
	cout << "*                  1、停车                              *\n";
	cout << "*                  2、离开                              *\n";
	cout << "*                                                       *\n";
	cout << "*                  注:一秒一毛                         *\n";
	cout << "*********************************************************\n";
	cout << "请输入功能(1~4):" << endl;
}




int main()
{
	Park park;
	Away away;
	Sidewalk side;
	
	Car car_l;

	while(1)
	{
		menu();
		char ch;
		cin >> ch;
		
		switch(ch)
		{
			case '1'://停车
					{
				
						cout << "请输入车牌号" << endl;
						cin >> car_l.plate_num;
						Time time;
						car_l.in_sec = time.time_sec;
						car_l.start_time = to_string(time.hour) + "时" + to_string(time.min) + "分" + to_string(time.sec) + "秒"; 
						park.car_in(car_l, side);
						break;
					}
			case '2'://离开 
					{
						cout << "请输入你的车牌号" << endl;
						cin >> car_l.plate_num;
						Time time;
						car_l.end_time = to_string(time.hour)  + "时" + to_string(time.min) + "分"; 
						park.car_out(car_l, side, away);
						
						cout << "你共计花费:" << park.money(car_l)/10 << "元" << endl;
						
						break;
					}
			default:
					break; 
		}
		
	}

}//dsa

5、运行结果

好的,以上就是本期内容了,欢迎大家参考指正。

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖尾猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值