数据结构与算法综合实验——队列实现停车场管理系统

问题描述:

(1).停车场配置

一个停车场,拥有100个停车位。车辆停放在一条单行道上,而且只能从停车场的一侧进入,从一段离开。停车场另外提供一条过道,可供10辆汽车临时停靠。

车辆在进入停车场时,只能从一端进入,另外一端出去。若停车场内已经停满,则后来的车就只能停在门外的过道上等候。一旦停车场有空位,过道E上的第一辆车就可进入停车场,过道也是只有一段进入,另外一段出去。

(2).收费规则(关于收费规则及进出时间可按照个人需求改进代码)

每辆停在停车场的车,在离开停车场时,必须按照停留的时间长短缴纳费用。停车场按每小时2元计费,进出时间均为整数,不足一小时不收费。

(3).提供的功能

1.车辆入场

2.车辆离开

3.查看停车场

4.退出系统

代码如下:

Park.h 

#include<iostream>
using namespace std;
struct Car {
	char lisence_plate[10];//车牌
	int time;//进入停车场的时间
};
//循环队列
typedef struct SqQueue {
	Car*base;//数组
	int front;//队头指针
	int rear;//队尾指针
	int size;//队列长度
}Queue;
int InitQueue(Queue&q, int nSize);//初始化队列
int DestoryQueue(Queue& q);//销毁队列
int QueueLength(Queue&q);//获得队列长度
int EnQueue(Queue&q, Car car);//向队尾插入元素
int DeQueue(Queue&q, Car&car);//从队首删除元素
int QueueTraverse(Queue q);//遍历队列中的元素并输出

Park.cpp

#include"Park.h"
//初始化队列
int InitQueue(Queue&q, int nSize) {
	q.base = (Car*)malloc(nSize*sizeof(Car));
	if (!q.base) {
		cout << "初始化队列内存分配失败";
		return -1;
	}
	q.front = q.rear = 0;
	q.size = nSize;
	return 0;
}
//销毁队列
int DestoryQueue(Queue& q) {
	if (q.base) {
		free(q.base);
		q.base = NULL;
	}
	q.front = q.rear = 0;
	q.size = 0;
	return 0;
}
//返回当前队列中的元素个数
int QueueLength(Queue&q) {
	return (q.rear - q.front + q.size) % q.size;
}
//往队列尾插入元素
int EnQueue(Queue&q, Car car) {
	//判断队列是否满
	if ((q.rear + 1) % q.size == q.front) {
		return -1;
	}
	q.base[q.rear] = car;
	q.rear = (q.rear + 1) % q.size;
	return 0;
	
}
//从队列头删除元素
int DeQueue(Queue&q, Car&car) {
	if (q.front == q.rear) {
		cout << "该队列中已经没有车了"<<endl;
		return -1;
	}
	car = q.base[q.front];
	q.front = (q.front + 1) % q.size;
	return 0;
}
//遍历队列中的序列并输出
int QueueTraverse(Queue q) {
	if (q.front == q.rear) {
		return -1;
	}
	int i = q.front;
	while (i != q.rear) {
		Car car;
		car = q.base[i];
		cout << "车牌号码:" << car.lisence_plate << "\t" << "入场时间为:" << car.time << endl;
		i = (i + 1) % q.size;
	}
	return 0;
}

 

ParkCPro.cpp 

 

#include "pch.h"
#include"Park.h"
#include<string>
#include <iostream>
using namespace std;
int Inpark(Queue&spPark, Queue&sqAisle) {
	cout << "---------进入停车场---------"<<endl;
	Car car;
	cout << "请输入进入的车牌号"<<endl;
	cin >> car.lisence_plate;
	cout << "请输入进入车的时间:"<<endl;
	cin >> car.time;
	if (EnQueue(spPark, car) == 0) {
		cout << "该车已进入停车场的第" << QueueLength(spPark) << "个位置" << endl;
	}
	else if (EnQueue(sqAisle, car) == 0) {
		cout << "停车场车位已满,车停至临时车位第" << QueueLength(sqAisle) << "位置" << endl;
	}
	else {
		cout << "停车场没有空余车位,请离开停车场"<<endl;
	}
	return 0;
}
//汽车出停车场
int OutPark(Queue&spPark, Queue&sqAisle) {
	cout << "-----------离开停车场-----------"<<endl;
	Car car;
	int leatime;
	cout << "请输入离场时间";
	cin >> leatime;
	if (DeQueue(spPark, car) == 0) {
		cout << "该汽车在停车场一共呆的时间为" << leatime - car.time << "小时"<<endl;
		cout << "停车费用为" << (leatime - car.time) * 2 << "元" << endl;
		if (DeQueue(sqAisle, car) == 0) {
			cout << car.lisence_plate << "从过道进入停车场" << endl;
			cout << "请输入入场时间" << endl;
			cin >> car.time;
			EnQueue(spPark, car);
		}
	}
	else {
		cout << "没有车要离开" << endl;
	}
	return 0;
}
int ViewPark(Queue&spPark, Queue&sqAisle) {
	cout << "--------查看停车场--------";
	QueueTraverse(spPark);
	QueueTraverse(sqAisle);
	return 0;
}
int main()
{
	Queue spPark;//声明停车场队列
	Queue sqAisle;//声明临时车位序列
	InitQueue(spPark, 100);
	InitQueue(sqAisle, 10);
	bool running = true;
	while (running) {
		cout << "-----------欢迎来到停车管理系统------------"<<endl;
		cout << "1.车辆管理"<<endl;
		cout << "2.车辆离开"<<endl;
		cout << "3.查看停车场" << endl;
		cout << "4.退出系统" << endl;
		cout << "输入您想进行的操作序号:" << endl;
		int a;
		cin >> a;
		switch (a) {
		case 1:
			Inpark(spPark, sqAisle);
			break;
		case 2:
			OutPark(spPark, sqAisle);
			break;
		case 3:
			ViewPark(spPark, sqAisle);
			break;
		case 4:
			running = false;
			cout << "再见"<<endl;
			break;


		}

	}
	//程序结束前,消除创建的两个队列
	DestoryQueue(spPark);
	DestoryQueue(sqAisle);
}

 运行结果如下:

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值