C++实现停车场管理系统

停车场管理

1.问题描述
自动停车场由一个可停放n辆车的狭长通道构成,且只有一个入口可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南一次排列(假设入口在最南端)。若停车场内已停满n辆车,则后来的汽车需在入口外的临时等候便道上等候,当有车要离开时,临时等候便道上的第一辆车即可进入。当自动停车场内某辆车要离开时,必须先将在它之后进入的车辆移出为其让路,待该辆车离开后,其他车辆再按原次序移入自动停车场。每辆车离开自动停车场时,应按其停留时间的长短缴费(在临时等候便道上停留的时间不收费)
2.问题分析
在该问题中,主要需利用栈与队列进行实现,停车场使用栈结构,临时等候便道使用队列。
3.代码
//main.cpp
#include
#include “Parking.h”
using namespace std;

int main() {
Stack Enter;//停车场栈
Queue W;//临时队列
Car p;
InitStack(Enter);//初始化停车场
InitQueue(W);//初始化临时队列
InitCar§;//初始化车辆信息
int choice;
cout << “欢迎使用停车场系统” << endl;
do {
cout << “***1.车辆到达登记 ***” << endl;
cout << “***2.车辆离开登记 ***” << endl;
cout << “***3.停车场信息显示 ***” << endl;
cout << “***4.临时便道信息显示 ***” << endl;
cout << “***101.退出系统 ***” << endl;
cout << “Enter choice:”;
cin >> choice;
switch (choice) {
case 1://车辆到达
Arrive(Enter, W, p);
cout << endl;
break;
case 2://车辆离开
Leave(Enter, W, p);
cout << endl;
break;
case 3://显示停车场信息
ShowStack(Enter);
cout << endl;
break;
case 4://显示临时便道信息
ShowQueue(W);
cout << endl;
break;
}
} while (choice != 101);
return 0;
}

//Parking.h
#pragma once
#ifndef _PARKING_H
#define _PARKING_H
#define maxstacksize 4
#define maxqueuesize 6
#define fee 0.1//一分钟0.1元
#include

struct Time {//时间节点
int hour;
int min;
};

struct Car {//车辆信息
std::string num;
Time reach;//车辆到达时间
Time leave;//车辆离开时间
int pos;//车在停车场或者临时便道上的位置
};

struct Stack {//停车场栈
Car C[maxstacksize];
int top;//栈顶元素的下标,top为-1表示栈空
};

struct Queue {//临时便道队列
Car S[maxqueuesize];
int front;//队列第一个元素下标
int rear;//队列最后一个元素下标,front==rear队列为空6
};

void InitStack(Stack& P);//初始化栈
void Push(Stack& P, Car& e);//入栈
void Pop(Stack& P, Car& e);//出栈
void InitQueue(Queue& Q);//初始化队列
void EnterQueue(Queue& Q, Car& e);//入队
void DeleteQueue(Queue& Q, Car& e);//出队
void Arrive(Stack& Enter, Queue& W, Car& p);//车辆到达
void Leave(Stack& Enter, Queue& W, Car& p);//车辆离开
void ShowStack(Stack& S);//显示停车场信息
void ShowQueue(Queue& Q);//显示临时便道信息
void InitCar(Car& p);//初始化车辆信息

#endif //_PARKING_H

//Parking.cpp
#include
#include “Parking.h”
using namespace std;

void InitStack(Stack& P) {
//初始化栈,构造一个空栈
P.top = -1;
}

void Push(Stack& P,Car& e) {
//入栈,将元素e置入P栈的栈顶
P.C[++P.top] = e;
}

void Pop(Stack& P, Car& e) {
//出栈,将栈顶元素用e返回
e = P.C[P.top–];
}

void InitQueue(Queue& Q) {
//初始化队列,构造一个空队列
Q.front = Q.rear = 0;
}

void EnterQueue(Queue& Q, Car& e) {
//将元素e入队
Q.S[Q.rear] = e;
Q.rear = (Q.rear + 1) % maxqueuesize;
}

void DeleteQueue(Queue& Q, Car& e) {
//出队,用e返回
e = Q.S[Q.front];
Q.front = (Q.front + 1) % maxqueuesize;
}

void Arrive(Stack& Enter, Queue& W,Car& p) {
//车辆进入停车场
if (Enter.top == maxstacksize - 1) {
cout << “停车场已满,进入临时便道!” << endl;
if ((W.rear + 1) % maxqueuesize == W.front) {
cout << “临时便道已满,请您去其他的停车场!” << endl;
}
else {
cout << “请输入车牌号<例:京A-88888>:”;
cin >> p.num;
EnterQueue(W, p);
}
}
else {
cout << “请输入车牌号<例:京A-88888>:”;
cin >> p.num;
cout << “请输入车牌号为” << p.num << “的车进入停车场的时间,hour:”;
cin >> p.reach.hour;
cout << “min:”;
cin>>p.reach.min;
p.pos = Enter.top + 2;
Push(Enter, p);
cout << “车牌号为“” << p.num << “”的车在停车场中的位置为:” << p.pos << endl;
}
}

void Leave(Stack& Enter, Queue& W, Car& p) {
//车辆出停车场,用p返回,若临时便道不为空,则临时便道第一辆车进入停车场
string num;
int flag = 0, pos = 0, time;
double pay=0;
Stack S;
InitStack(S);
Car e;
if (Enter.top == -1) cout << “停车场为空!” << endl;
else {
cout << “请输入离开车辆的车牌号<例:京A-88888>:”;
cin >> num;
for (int i = 0; i <= Enter.top; i++) {
if (Enter.C[i].num == num) {
flag++;
pos = Enter.C[i].pos;
}
}
if (!flag) cout << “车牌号为“” << num << “”的车不在停车场中!” << endl;
else {
for (int i = Enter.top; i >= pos; i–) {
Pop(Enter, e);
Push(S, e);
}
Pop(Enter, p);
cout << “请输入车牌号为“” << p.num << “”的车离开停车场的时间,hour:”;
cin >> p.leave.hour;
cout << “min:”;
cin >> p.leave.min;
cout << “车牌号为“” << p.num << “”的车进入停车场的时间为,” << p.reach.hour << ‘:’ << p.reach.min << endl;
cout << “车牌号为“” << p.num << “”的车驶出停车场的时间为,” << p.leave.hour << ‘:’ << p.leave.min << endl;
time = (p.leave.hour - p.reach.hour) * 60 + (p.leave.min - p.reach.min);
pay = time * fee;
cout << “车牌号为“” << p.num << “”的车需付停车费” << pay << “元” << endl;
cout << endl;
while (S.top >= 0) {
Pop(S, e);
e.pos–;
Push(Enter, e);
}
if (W.front != W.rear) {
DeleteQueue(W, e);
cout << “请输入车牌号为“” << e.num << “”的车进入停车场的时间,hour:”;
cin >> e.reach.hour;
cout << “min:”;
cin >> e.reach.min;
e.pos = Enter.top + 2;
Push(Enter, e);
cout << “车牌号为“” << e.num << “”的车在停车场中的位置为:” << e.pos << endl;
}
}
}
}

void ShowStack(Stack& S) {
//输出停车场信息
if (S.top == -1) cout << “停车场为空!” << endl;
else {
//Car e;
cout << “停车场中的车辆信息为:” << endl;
for (int i = 0; i <= S.top; i++) {
//e = S.C[i];
cout << “车辆位置为:” << S.C[i].pos << " ";
cout << “车牌号为:” << S.C[i].num << " ";
cout << “车辆进入的时间为:” << S.C[i].reach.hour << ‘:’ << S.C[i].reach.min << endl;
}
}
cout << endl;
}

void ShowQueue(Queue& Q) {
//输出临时便道信息
int i=0;
if (Q.front == Q.rear) cout << “临时便道为空!” << endl;
else {
cout << “临时便道中的车辆信息为:” << endl;
int t = Q.front % maxqueuesize;
Car e;
while (t != Q.rear) {
e = Q.S[t];
i++;
cout << “车辆位置:” << i << " ";
cout << “车牌号为:” << e.num << endl;
t = (t + 1) % maxqueuesize;
}
}
cout << endl;
}

void InitCar(Car& p) {
//初始化车辆信息
p = { “”,{0,0},{0,0},0 };
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值