课设之停车场管理

题目描述

设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。试为停车场编制按上述要求进行管理的模拟程序。以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;当车辆将要离去时,若车在停车场内,模拟输出汽车出入情况并输出汽车在停车场内停留的时间,若车在便道上,直接输出汽车在停车场内停留的时间:0。栈以顺序存储结构实现,队列以链表结构实现。

输入要求

第一行输入一个整数n:代表停车场最多可以停放n辆汽车。(1<=n<=100)
接下来输入一个整数q:代表有q个信息。(1<=q<=200)
每一个信息,输入三个数据项:汽车到达(“arrive”)或汽车离去(“leave”),汽车的id,以及到达或离去的时间点t。(0<=t<=10000,id只含数字和字母,1<=strlen(id)<=10)
数据保证:到达的汽车不会已经在停车场或便道,离开的汽车一定在停车场或便道,且q个信息的时间点t升序。

输出要求

对于每一个信息输出一行:
汽车是到达(“arrive”):如果在便道上输出字符串"Queue",如果在停车场内输出字符串"Stack",并输出所在的位置,栈底的元素是第一个位置,队首的元素是第一个位置(字符串和位置用空格隔开)。
汽车是离开(“leave”):如果在停车场内,以"汽车id"+":"+"in或者out"模拟输出汽车的移动情况,再输出停留在停车场的时间(忽略让路的时间);如果在便道上,直接输出汽车在停车场内停留的时间:0。

1、定义三个全局变量n:停车场可以停放的车辆,In_count:进栈的序号, En_Queue:入队的序号

int n;
int In_count = 1;
int En_Queue = 1;

2、定义栈、队列、以及Car类型的结构体

typedef struct Car {
	char id[10];
	int In_time;
	int Out_time;
}Car;
typedef struct {
	Car *base;
	Car *top;
	int length;
}Stack;
typedef struct QNode {
	Car data;
	QNode *next;
}QNode, *QueuePtr;
typedef struct {
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

3、初始化栈和队列

void InitStack(Stack &s) {
	s.base = new Car[n];
	s.top = s.base;
	s.length = n;
}
void InitQueue(LinkQueue &Q) {
	Q.front = Q.rear = new QNode;
	Q.front->next = NULL;
}

4、创建入队和出队函数

void EnQueue(LinkQueue &Q, Car e) {
	//入队
	cout << "Queue " << En_Queue++ << endl;
	QNode *p = new QNode;
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
}
void DeQueue(LinkQueue &Q, Car e) {
	//出队
	En_Queue--;
	QNode *p = new QNode;
	p = Q.front;
	while (p->next&&strcmp(e.id, p->next->data.id) != 0)
	{
		p = p->next;
	}
	QNode *d = new QNode;
	d = p->next;
	p->next = d->next;
	if (Q.rear == d)
		Q.rear = Q.front;

}

5、创建入栈和倒栈以及出栈函数

void Push(Stack &s, Car e) {//入栈
	*s.top++ = e;
}
void Pop_Daozhan(Stack &s, Car &e) {
	if (s.top == s.base)
		return;
	e = *--s.top;
}
void Pop(Stack &s, LinkQueue &Q, Car e) {//出栈
						 //肯定有出队加入栈
	In_count--;
	Stack p;
	InitStack(p);
	Car a;
	Car *b;
	b = s.top;
	b--;
	while (strcmp(e.id, b->id) != 0)
	{
		b--;
		Pop_Daozhan(s, a);
		cout << a.id << ":out ";
		Push(p, a);
	}
	a = *--s.top;
	int out = e.Out_time;
	int cha = e.Out_time - a.In_time;
	//输出a的数据
	cout << a.id << ":out ";
	while (p.top != p.base)
	{
		Pop_Daozhan(p, a);
		cout << a.id << ":in ";
		Push(s, a);
	}
	if (Q.front == Q.rear&&Q.front->next == NULL) {
		cout << cha << endl;
		return;
	}
	else {
		QNode *m = new QNode;
		En_Queue--;
		m = Q.front->next;
		cout << m->data.id << ":in ";
		cout << cha << endl;
		m->data.In_time = out;
		Push(s, m->data);
		In_count++;
		Q.front->next = m->next;
		if (Q.rear == m) {
			Q.rear = Q.front;
		}
		delete m;
	}
}

6、创建一个”来车“的方法,其中先判断栈是否满,如果栈不满则入栈,负责入队。

void In_Car(Stack &s, LinkQueue &Q, Car e) {
	//判断栈是否满
	if (s.top - s.base < s.length) {
		cout << "Stack " << In_count++ << endl;
		Push(s, e);
	}
	else
		EnQueue(Q, e);
}

7、创建一个”出车“的方法,先遍历队列中是否有这辆车,如果有,则出队,否则就出栈。

void Out_Car(Stack &s, LinkQueue &Q, Car e) {
	QNode *p = new QNode;
	p = Q.front->next;
	while (p != NULL&&strcmp(e.id, p->data.id) != 0)
	{
		p = p->next;
	}
	if (p) {
		DeQueue(Q, e);
		cout << '0' << endl;
	}
	else {
		Pop(s, Q, e);
	}
}

8、最后定义main方法执行

int main() {
	int m, Time;
	Stack S;
	LinkQueue Q;
	Car e;
	cin >> n >> m;
	char type[10], id[10];
	InitStack(S);
	InitQueue(Q);
	for (int i = 0; i < m; i++) {
		cin >> type >> id >> Time;
		strcpy(e.id, id);
		if (strcmp(type, "arrive") == 0) {
			e.In_time = Time;
			In_Car(S, Q, e);
		}
		else {
			//出对或出栈
			e.Out_time = Time;
			Out_Car(S, Q, e);
		}
	}
	return 0;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值