模拟停车场管理系统(栈和队列的应用)

模拟停车场管理系统(数据结构)

ps. 这是我们学校的实验课题目,本文章用来记录,本人能力有限,本文章仅供参考


实验目的和要求

通过实验进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。


问题描述

设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。


基本要求

以栈模拟停车场,以队列模拟车场外的便道 ,按照从终端输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)栈以顺序结构出现,队列以链表结构实现


测试数据

(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、、JF005、JF006、JF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。
(2)(1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。
(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。
(4)程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。


效果图

开始/结束界面
初始化界面
1.车辆到达
依次进入五辆汽车
2.车辆离去
后面汽车让出
3.查看车库
查看车库
4.退出系统
退出


源代码

#include <iostream>
#include <string>
using namespace std;

#define MAXSIZE 3	//停车场最多可停留汽车辆数
const float price = 0.05;	//每分钟停车费用
int i;	//汽车在便道中的位置

//时间
typedef struct time {
	int h, m;	//小时 分钟
}Time;

//汽车
typedef struct car {
	Time t1, t2;	//到达时间和离开时间
	string num;	//车牌号
	int p1, p2;	//汽车在停车场或者便道停留位置
}Car;

//停车场
typedef struct {
	Car data[MAXSIZE];
	int top;
}SeqList;

//便道
typedef struct qnode {
	Car data;
	struct qnode* next;
}QNode;
typedef struct lqueue {
	QNode* front, * rear;
}LQueue;

//初始化停车场
SeqList* Init_SeqList()
{
	SeqList* s;
	s = new SeqList;
	s->top = -1;
	return s;
}

//初始化便道
LQueue* Init_LQueue()
{
	LQueue* q;
	QNode* p;
	q = new lqueue;
	p = new qnode;
	p->next = NULL;
	q->front = p;
	q->rear = p;
	return q;
}

//汽车进入停车场
void Push_SeqList(SeqList* s, Car x)
{
	s->top++;
	s->data[s->top] = x;
}

//汽车离开停车场
Car Pop_SeqList(SeqList* s)
{
	Car x = s->data[s->top];
	s->top--;
	return x;
}

//停车场满的时候进入便道
void In_LQueue(LQueue* q, Car x)
{
	QNode* p;
	p = new qnode;
	p->data = x;
	p->next = NULL;
	q->rear->next = p;
	q->rear = p;
}

//停车场有车离开有空位时便道上的车辆按照到达顺序依次进入停车场
Car Out_LQueue(LQueue* q)
{
	Car x;
	QNode* p;
	p = q->front->next;
	q->front->next = p->next;
	x = p->data;
	delete p;
	if (q->front->next == NULL)	//只有一个元素时,出队后队空,此时还要修改队尾指针
	{
		q->front->next = NULL;
		q->rear = q->front;
	}
	return x;
}

//汽车到达
void Car_In(SeqList* p, LQueue* q)
{
	Car c;
	cout << "请依次输入汽车车牌号和到达时间(小时,分钟):";
	cin >> c.num >> c.t1.h >> c.t1.m;
	if (p->top == MAXSIZE - 1)
	{
		//进入便道
		c.p2 = ++i;
		cout << "生意火爆,停车场已满,进入便道等待,位置为:00" << c.p2 << endl;
		In_LQueue(q, c);
	}
	else {
		//进入停车场
		c.p1 = p->top + 2;
		cout << "进入停车场,位置为:00" << c.p1 << endl;
		Push_SeqList(p, c);
	}
}

//检验停车场内是否有该车辆
Car* Car_if(SeqList* p, Car c)
{
	int t;	//保留下标
	SeqList* temp = Init_SeqList();
	Car x;
	while (c.num != p->data[p->top].num && p->top != -1)
	{
		x = Pop_SeqList(p);
		Push_SeqList(temp, x);
	}
	t = p->top;
	//恢复停车场
	while (temp->top != -1)
	{
		x = Pop_SeqList(temp);
		Push_SeqList(p, x);
	}
	if (t == -1) return NULL;
	else return &x;
}

//汽车离去
void Car_Out(SeqList* p, LQueue* q)
{
	Car c, x, first;
	int flag = 0;
	if (p->top == -1)
	{
		//停车场无车
		cout << "当前停车场无车~" << endl;
		return;
	}
	if (p->top == MAXSIZE - 1)
	{
		//当停车库满了的时候判断便道是否有车
		if (q->front == q->rear) return;
		else {
			first = Out_LQueue(q);	//便道内第一辆车
			flag = 1;
		}
	}
	SeqList* temp = Init_SeqList();	//临时栈,保留有车离开让车时从停车场退出的车辆
	cout << "请依次输入汽车车牌号和离去时间(小时,分钟):";
	cin >> c.num >> c.t2.h >> c.t2.m;
	//判断停车场内是否有该车辆
	if (!Car_if(p, c))
	{
		cout << "该停车场内没有该车辆~" << endl;
		return;
	}
	while (c.num != p->data[p->top].num)
	{
		x = Pop_SeqList(p);
		cout << "车牌号为" << x.num << "的车让路" << endl;
		Push_SeqList(temp, x);
	}
	x = Pop_SeqList(p);	//目标车辆
	x.t2.h = c.t2.h, x.t2.m = c.t2.m;
	float t = (x.t2.h - x.t1.h) * 60 + x.t2.m - x.t1.m; //总停留分钟
	float t1, t2;
	if (x.t2.m >= x.t1.m)
	{
		t2 = x.t2.m - x.t1.m;
		t1 = x.t2.h - x.t1.h;
	}
	else {
		t2 = x.t2.m + 60 - x.t1.m;
		t1 = x.t2.h - x.t1.h - 1;
	}
	cout << "车牌号为" << x.num << "的车开出" << endl;
	//刚才让出的车辆按照原来的顺序依次开入停车场
	while (temp->top != -1)
	{
		x = Pop_SeqList(temp);
		x.p1 = p->top + 2;
		cout << "车牌号为" << x.num << "的车开入" << endl;
		Push_SeqList(p, x);
	}
	//若便道有车则让便道上第一辆车进入停车场
	if (flag)
	{
		first.p1 = p->top + 2;
		Push_SeqList(p, first);
		cout << "车牌号为" << first.num << "的车开入" << endl;
	}
	cout << "停留时间:" << t1 << "小时" << t2 << "分钟" << "    收费:" << t * price << "元\n" << "欢迎下次光临~" << endl;
}

//显示停车场内车辆信息
void Display(SeqList* p)
{
	Car x;
	SeqList* temp = Init_SeqList();
	if (p->top == -1)
	{
		cout << "当前停车场无车,生意惨淡TvT~" << endl;
		return;
	}
	else
	{
		while (p->top != -1)
		{
			x = Pop_SeqList(p);
			Push_SeqList(temp, x);
		}
		cout << "当前停放的车辆信息:" << endl;
		while (temp->top != -1)
		{
			x = Pop_SeqList(temp);
			cout << "停车位置为:00" << x.p1 << "  车牌号码:" << x.num << "  停车时间:" << x.t1.h << "点" << x.t1.m << "分" << endl;
			Push_SeqList(p, x);
		}
	}
}

int main()
{
	int flag = 1;
	SeqList* p = Init_SeqList();
	LQueue* q = Init_LQueue();
	while (flag)
	{
		cout << "=========================欢迎使用停车场===========================" << endl;
		puts("");
		cout << "                   本停车场最多可停放" << MAXSIZE << "辆汽车" << endl;
		puts("");
		cout << "==================================================================" << endl;
		int i;
		cout << "**********1.汽车到达  2.汽车离去  3.查看车库  4.退出系统**********" << endl;
		scanf("%d", &i);	//使用cin >> i;出现错误
		while(getchar() != '\n');	//清除缓冲区
		switch (i)
		{
		case 1:Car_In(p, q); break;
		case 2:Car_Out(p, q); break;
		case 3:Display(p); break;
		case 4:cout << "掰掰,下次再见~" << endl; flag = 0; break;
		default:cout << "输入错误啦~请输入数字1--4重新选择~" << endl;break;
		}
	}
	system("pause");
	return 0;
}
  • 21
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
问题描述:利用堆栈队列实现一个停车场管理系统 基本要求: 设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟停车场的管理。车辆的信息包括:车牌号、汽车到达/离去标志、到达/离去时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要三个数据,其中车辆数据为:A表示到达,D表示离去,E表示程序结束。车辆牌照为整型数据。进场或离场时间同样为整型数据。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。 (3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。 [测试数据] (A,1,1) (A,2,2) (A,3,3) (A,4,4) (A,5,5) (D,2,7) (A,1,8) (A,4,9)
这个停车场管理系统是基于C语言数据结构栈和队列思想的,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。这个系统的基本要求是要求以顺序栈模拟停车场,以链队列模拟便道。具体的算法思想如下: 1.车辆停入停车场的流程:首先判断停车场的车位是否停满。两种情况:(1)停满时此时后来的车辆只能停在走道上 (2)未停满时后来的车辆继续入栈。 2.车辆出站的思想。两种情况:(1)车辆在栈顶时,此时直接出栈而用不到辅助栈(2)车辆不在车顶时排在前面的车辆必须让位,此时它才能出栈,算法思想是首先根据输入的车牌号进行在栈中搜索,返还一个角标,根据角标来,找到出栈的车辆,这时前面的车辆入辅助栈,当循环的目标车辆时,这时不需要入辅助栈,直接出栈即可! 总体结构思路如下:这时车位停满的情况,若非栈顶出栈则需要把他前面的车让位进辅助栈,当目标车出栈的再回来。 以下是一个简单的栈和队列停车场管理系统C语言代码的范例,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 #define MAXCAR 20 #define PRICE 1 typedef struct{ char num[10]; int time; }Car; typedef struct{ Car stack[MAXSIZE]; int top; }Stack; typedef struct{ Car queue[MAXSIZE]; int front,rear; }Queue; Stack park; Queue road; void InitStack(Stack *s){ s->top=-1; } int IsFull(Stack *s){ if(s->top==MAXSIZE-1) return 1; else return 0; } int IsEmpty(Stack *s){ if(s->top==-1) return 1; else return 0; } void Push(Stack *s,Car c){ if(IsFull(s)){ printf("停车场已满!\n"); return; } s->top++; s->stack[s->top]=c; } Car Pop(Stack *s){ Car temp; if(IsEmpty(s)){ printf("停车场已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=s->stack[s->top]; s->top--; return temp; } void InitQueue(Queue *q){ q->front=q->rear=0; } int IsQueueFull(Queue *q){ if((q->rear+1)%MAXSIZE==q->front) return 1; else return 0; } int IsQueueEmpty(Queue *q){ if(q->front==q->rear) return 1; else return 0; } void InQueue(Queue *q,Car c){ if(IsQueueFull(q)){ printf("便道已满!\n"); return; } q->queue[q->rear]=c; q->rear=(q->rear+1)%MAXSIZE; } Car OutQueue(Queue *q){ Car temp; if(IsQueueEmpty(q)){ printf("便道已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=q->queue[q->front]; q->front=(q->front+1)%MAXSIZE; return temp; } void Arrive(){ Car temp; printf("请输入车牌号和到达时间:\n"); scanf("%s%d",temp.num,&temp.time); if(park.top<MAXCAR-1){ Push(&park,temp); printf("停车成功!\n"); } else{ InQueue(&road,temp); printf("停车场已满,停在便道上!\n"); } } void Leave(){ Car temp; int time,cost,i,flag=0; printf("请输入车牌号和离开时间:\n"); scanf("%s%d",temp.num,&time); while(!IsEmpty(&park)){ temp=Pop(&park); if(strcmp(temp.num,num)==0){ flag=1; cost=(time-temp.time)*PRICE; printf("停车时间为%d小时,应缴纳停车费%d元!\n",time-temp.time,cost); for(i=0;i<park.top;i++){ Push(&park,Pop(&park)); } return; } else{ Push(&road,temp); } } if(flag==0){ printf("未找到该车辆!\n"); return; } while(!IsEmpty(&road)){ Push(&park,OutQueue(&road)); } } void List(){ int i; if(IsEmpty(&park)){ printf("停车场为空!\n"); return; } printf("停车场:\n"); for(i=park.top;i>=0;i--){ printf("%s %d\n",park.stack[i].num,park.stack[i].time); } if(IsQueueEmpty(&road)){ printf("便道为空!\n"); return; } printf("便道:\n"); for(i=road.front;i!=road.rear;i=(i+1)%MAXSIZE){ printf("%s %d\n",road.queue[i].num,road.queue[i].time); } } int main(){ int choice; InitStack(&park); InitQueue(&road); while(1){ printf("停车场管理系统\n"); printf("1.车辆到达\n"); printf("2.车辆离开\n"); printf("3.显示车辆信息\n"); printf("4.退出系统\n"); printf("请输入操作编号:\n"); scanf("%d",&choice); switch(choice){ case 1:Arrive();break; case 2:Leave();break; case 3:List();break; case 4:exit(0); default:printf("输入有误,请重新输入!\n"); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值