一、实验题目解析

设计一个简易的停车场管理系统,实现车入库、出库以及状态的管理。

二、需求分析

[题目概述]
设停车场内只有一个的停放 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’表示输入结束。
[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟 管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到 达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存 储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数 据项:汽车的牌照号码和进入停车场的时刻。

三、概要设计

初始化界面:
在这里插入图片描述
程序代码:

/*
pmj
2019.11.15
Ting che chang guan li xi tong
*/
#include <iostream>
using namespace std;
#include<stdlib.h>

typedef struct Data {  //栈数据
	char x;
	int time1;
	int time2;
	int num;
	int wei[2];
};

typedef struct {  //栈结构体
	Data *base;
	Data *top;
	int stacksize;
} Stack;

typedef struct Qnode { //队列数据
	Data data;
	struct Qnode *next;
}*qeeue;

typedef struct Line {  //队列结构体
	qeeue front;
	qeeue rear;
};

void InitStack(Stack &s) {  //初始化栈
	s.base = (struct Data*)malloc(2*sizeof(struct Data));
	if (!s.base) cout<<"建立空间失败!";
	s.top = s.base;
	s.stacksize = 2;
}

void Initqueue(Line &I) {  //初始化队列
	I.front = I.rear = (struct Qnode*)malloc(sizeof(struct Qnode));
	if (!I.front) cout<<"建立空间失败!";
	I.front->next = NULL;
}

void push(Stack &s,Data e) {  //进栈
	*s.top++ = e;
}

void Enquene(Line &l, Data e) {  //入队列
	qeeue q = (struct Qnode*)malloc(sizeof(struct Qnode));
	q->data = e;
	q->next = NULL;
	l.rear->next = q;
	l.rear = q;
}

void Setdata(Data &e,int i) {  //建立数据
	cout<<"请输入车辆的状态信息:(A为到达 D为驶离)";
	cin>>e.x;
	cout<<"请输入车辆的车牌号码:";
	cin>>e.num;
	cout<<"请输入车辆到达时间:";
	cin>>e.time1;
	e.wei == &i;
}

void gettop(Stack s, Data &e) {  //获取栈顶元素
	if (s.top == s.base) printf("车库为空\n");
	e = *(s.top - 1);
}

void pop(Stack &s, Data &e) {   //出栈
	if (s.top == s.base) printf("车库为空\n");
	e = *--s.top;
}

void fee(Data &e) {    //计算停车费
	int f, F;
	cout<<"请输入车辆离开的时间:";
	cin>>e.time2;
	cout<<"请输入每分钟的单价:";
	cin>>f;
	F = (e.time2 - e.time1)*f;
	cout<<"请缴费"<<F<<"元\n";
}

void delequeue(Line &l, Data &e) { //出队列
	if (l.front == l.rear)cout<<"无车辆等候";
	qeeue q = l.front->next;
	e = q->data;
	l.front->next = q->next;
	if (l.rear == q) l.rear = l.front;
	free(q);
}

int main() {
	Stack s;
	InitStack(s);
	cout<<"欢迎来到停车厂管理系统\n";
loop:
	for (int i = 0;;) {
		cout<<"请输入车辆管理信息(a入库 d出库 e退出程序)";
		char choice;
		cin>>choice;
		if(choice=='a'||choice=='A') {
			if (s.top - s.base == s.stacksize) {
				cout<<"车库已满,请进行排队!"<<endl;
				Line l1;
				Initqueue(l1);
				Data e;
				Setdata(e,i);
				Enquene(l1, e);
			} else {
				Data e;
				Setdata(e, i);
				i++;
				push(s, e);
				cout<<"请入第"<<i<<"号车库\n";
			}
		}
		if(choice=='D'||choice=='d') {
			Line Q;
			Initqueue(Q);
			int number;
			Data e;
			cout<<"请输入车辆的车牌号码:";
			cin>>number;
			gettop(s, e);
			for (; e.num != number && s.base != s.top; gettop(s, e)) {
				Enquene(Q, e);
				pop(s, e);
			}
			if (e.num == number) {
				fee(e);
				cout<<"车辆已出库!"<<endl;
				i--;
				goto loop;
			} else {
				cout<<"车库无该车辆"<<endl;
				goto loop;
			}
			while (Q.front != Q.rear) {
				delequeue(Q, e);
				push(s, e);
			}
			Line q;
			push(s, e);
			delequeue(q, e);
		}
		if (choice == 'E'||choice == 'e') goto loap;
	}
loap:
	return 0;
}

四、调试运行:

在这里插入图片描述
运行结果如图所示,无错误。

五、系统使用说明

第一步:输入车辆管理信息a or d
第二步:输入状态信息a or d or e
第三步:输人车牌号
第四步:输入到达时间
第五步:如果离去,输入缴费金额

六、测试结果

在这里插入图片描述
在这里插入图片描述

七、其他数据结构实例

对于其他的实例,可以查看上文讲述的内容:
数据结构:编程带你了解约瑟夫环

以上内容为个人学习总结,如有遗漏或者错误,请在评论区中指正!!!

Logo

快速构建 Web 应用程序

更多推荐