Sistema de gerenciamento de estacionamento de simulação de pilha e fila C ++

1. Título

Um determinado estacionamento pode estacionar n carros, e o estacionamento tem apenas um portão. Cada carro que sai do estacionamento exige que o carro anterior saia do estacionamento para dar lugar a ele e, em seguida, os carros que deram lugar ao estacionamento novamente. O diagrama esquemático é o seguinte:Insira a descrição da imagem aqui

É necessário projetar um método de organização de dados razoável, projetar um algoritmo para realizar um sistema de gerenciamento de estacionamento, realizar a entrada e saída de veículos e cobrar de acordo com o tempo de estacionamento.

Em segundo lugar, as renderizações

  • Cinco carros entram no estacionamento com apenas três carros (assumindo que a capacidade do estacionamento seja 3)
    Insira a descrição da imagem aqui
  • Verifique o status do estacionamento enquanto deixa um carro que sai da área de espera entrar
    Insira a descrição da imagem aqui
  • Verifique o estado do estacionamento e deixe um carro sair da sala de espera e entrar
    Insira a descrição da imagem aqui
  • Visualize os registros históricos de pagamento de estacionamento dos dois veículos que saíram do estacionamento
    Insira a descrição da imagem aqui

Três, análise

  • Para esta pergunta, só precisamos usar a estrutura de dados de pilhas e filas para completar os requisitos. Como o estacionamento tem apenas um portão, podemos aproximar o estacionamento como uma pilha (capacidade 3) , O veículo que entrar primeiro deve abrir caminho para o carro de trás. Quando o estacionamento estiver cheio, podemos usar a fila para simular um pátio de espera. Assim que o estacionamento sair, os carros no quintal podem entrar. Neste momento, a área de espera segue a regra de chegar primeiro, por isso é muito adequado utilizar filas. Também calculamos o tempo de entrada e saída dos carros, e a seguir calculamos com o valor que definimos para obter o valor a pagar por cada carro Ao mesmo tempo, também adicionei uma função de visualizar registros históricos de estacionamento e limpar a tela. Visualizar registros históricos de estacionamento pode facilitar o administrador para verificar o veículo e evitar que as pessoas discordem da quantidade de estacionamento. A função de limpar a tela é principalmente para tornar a interface mais refrescante. , Quando a informação de saída é muito grande, você pode limpar a tela.

Quarto, o código

//XMUT ZRZ 2020.6.19
#include<iostream>
#include<queue>
#include<stack>
#include<time.h>
#include<ctime>
#include<windows.h>
#include <iomanip>
#define capacity 3
using namespace std;
typedef struct Car {
    
    
	string License="";
	double begin=0;
	double end=0;
	string begin_time;
	string end_time;
	int order_number=0;
	double cost=0;
}Car;
struct cmp2 {
    
    
	bool operator ()(Car& a, Car& b) {
    
    
		return a.begin > b.begin;//最大值优先  
	}
};
int total = 0;//统计一共来过多少辆车
int money = 1;//一分钟一块钱
bool vis[200];
queue<Car> Waiting;
stack<Car> Parking;
priority_queue<Car,vector<Car>,cmp2> history;
string getTime()
{
    
    
	time_t timep;
	time(&timep);
	char tmp[64];
	strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&timep));
	return tmp;
}
void Wait(string license)
{
    
    
	Car temp;
	auto t = clock();
	temp.License = license;
	temp.begin = t;
	temp.begin_time = getTime();
	temp.order_number = ++total;
	Waiting.push(temp);
	cout << temp.License << "进入侯车道" << endl;
}
void Add(string license)
{
    
    
	if (Parking.size()>=capacity)
	{
    
    
		Wait(license);
	}
	else
	{
    
    
		Car temp;
		auto t = clock();
		temp.License = license;
		temp.begin= t;
		temp.begin_time = getTime();
		temp.order_number = ++total;
		Parking.push(temp);
		cout << temp.License << "进入车场,开始计时收费" << endl;
	}
}
void Leave(string license)
{
    
    
	stack<Car> temp;
	int cnt = Parking.size();
	while(!Parking.empty())
	{
    
    
		Car car=Parking.top();
		Parking.pop();
		if (car.License == license)
		{
    
    
			cout << car.License << "退出车场";
			auto t = clock();
			car.end = t;
			car.end_time = getTime();
			car.cost = (car.end - car.begin)/60000 * money;
			cout << "花费停车金额:" << setprecision(2)<<car.cost << endl;
			history.push(car);
			break;
		}
		else
		{
    
    
			temp.push(car);
		}
	}
	if (temp.size() == cnt)
	{
    
    
		cout << "没有找到相应车牌号的车" << endl;
		while (!temp.empty())
		{
    
    
			Parking.push(temp.top());
			temp.pop();
		}
	}
	else
	{
    
    
		while(!temp.empty())
		{
    
    
			Parking.push(temp.top());
			temp.pop();
		}
		if (!Waiting.empty())
		{
    
    
			Car car = Waiting.front();
			Waiting.pop();
			Add(car.License);
		}
	}
}
void Check()
{
    
    
	if (!Parking.empty())
	{
    
    
		cout << "当前在停车场的车为:" << endl;
		stack<Car> temp = Parking;
		while (!temp.empty())
		{
    
    
			Car x = temp.top();
			cout << "车牌号为:"<< x.License << " 进入停车场时间:" << x.begin_time << endl;
			temp.pop();
		}
	}
	else
	{
    
    
		cout << "当前停车场没有车" << endl;
	}
	if (!Waiting.empty())
	{
    
    
		cout << "当前在侯车场的车为:" << endl;
		queue<Car> temp1 = Waiting;
		while (!temp1.empty())
		{
    
    
			Car x = temp1.front();
			cout <<"车牌号为:"<<x.License << " 进入候车场时间:" << x.begin_time << endl;
			temp1.pop();
		}
	}
	else
	{
    
    
		cout << "当前侯车场没有车" << endl;
	}
}
void History_Check()
{
    
    
	cout << "总共有" << history.size() << "辆车停过" << endl;
	priority_queue<Car, vector<Car>, cmp2> temp = history;
	int i = 1;
	while (!temp.empty())
	{
    
    
		
		Car x = temp.top();
		temp.pop();
		cout <<"第"<<i++<<"辆车的车牌为:"<<x.License << " 停入时间为:" << x.begin_time << " 离开时间为:" << x.end_time << " 停车费为:" << setprecision(2) << x.cost << endl;
	}
}
int main()
{
    
    
	cout << "--------------------------欢迎使用停车管理系统--------------------------" << endl;
	cout << "1.车辆进入 2.车辆离开 3.查看当前车场状态 4.查看车场历史记录 5.清屏" << endl;
	while (1) {
    
    
		int i;
		cout << "请输入要执行的操作: ";
		cin >> i;
		switch (i)
		{
    
    
		case 1:
			{
    
    
				string in;
				cout << "请输入进入车辆车牌:";
				cin >> in;
				Add(in);
			}
			break;
		case 2:
			{
    
    
				string out;
				cout << "请输入离开车辆车牌:";
				cin >> out;
				Leave(out);
			}
			break;
		case 3:
		{
    
    
			Check();
			break;
		}
		case 4:
		{
    
    
			memset(vis, false, sizeof(vis));
			History_Check();
			break;
		}
		case 5:
		{
    
    
			system("cls");
			cout << "--------------------------欢迎使用停车管理系统--------------------------" << endl;
			cout << "1.车辆进入 2.车辆离开 3.查看当前车场状态 4.查看车场历史记录 5.清屏" << endl;
		}
		break;
		}
	}
}

Acho que você gosta

Origin blog.csdn.net/qq_43663263/article/details/106854126
Recomendado
Clasificación