数据结构 停车场管理

Posted Ice丨shine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 停车场管理相关的知识,希望对你有一定的参考价值。

目录

一、需求分析

功能需求:

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

界面需求:

输入停车场能停放的车辆数量和每小时收费价格。再输入车辆的进入/离开情况,车牌号和进入/离开时间,输出车辆的位置和离开停车场时所需的费用。

二、概要设计

接口设计

void push(int flag, struct stackstruct *p)
struct stackstruct *pop(int id, int time,int money)// 弹出一个元素,找和离开车牌相同的车,找到则输出费用,返回空,否则返回弹出的元素
struct stackstruct *pop1()//弹出临时栈的一个元素并返回
void Enqueue(struct stackstruct *p)// 停车场满,入队列操作
struct stackstruct *Dequeue(int time) //出队列操作,返回弹出的元素

数据结构设计

struct stackstruct                     /*栈的结构体*/

	int id;//记录车牌
	int time;//记录进入时间
	struct stackstruct *pre;
	struct stackstruct *next;
;

struct queuestruct                    /*队列的结构体*/

	int id;
	struct queuestruct *next;
;

三、详细设计

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
struct stackstruct                     /*栈的结构体*/

	int id;//记录车牌
	int time;//记录进入时间
	struct stackstruct *pre;
	struct stackstruct *next;
;

struct queuestruct                    /*队列的结构体*/

	int id;
	struct queuestruct *next;
;

struct stackstruct *stackhead1, *stackend1;
struct stackstruct *stackhead2, *stackend2;
struct queuestruct *queuehead, *queueend;
int stack1count, stack2count;                         /*栈中元素总数*/
int queuecount;                         /*队列中元素总数*/

void push(int flag, struct stackstruct *p)

	struct stackstruct *stack;      //临时结点
	if (flag == 0)                  /*栈1进栈操作*/
	
		if (stack1count == 0)
		//是第一个结点
			stackhead1 = (struct stackstruct *)malloc(sizeof(struct stackstruct));//开辟新空间
			stackhead1->id = p->id;
			stackhead1->time = p->time;
			stackhead1->next = NULL;
			stackhead1->pre = NULL;
			stackend1 = stackhead1;
		
		else
		
			stack = (struct stackstruct *)malloc(sizeof(struct stackstruct));
			stack->id = p->id;
			stack->time = p->time;
			stackend1->next = stack;
			stack->pre = stackend1;
			stack->next = NULL;
			stackend1 = stack;
		
		stack1count++;//记录停车场里车位数
	
	else if (flag == 1)               /*临时储存的栈2进栈操作*/
	
		if (stack2count == 0)
		
			stackhead2 = (struct stackstruct *)malloc(sizeof(struct stackstruct));
			stackhead2->id = p->id;
			stackhead2->time = p->time;
			stackhead2->next = NULL;
			stackhead2->pre = NULL;
			stackend2 = stackhead2;
		
		else
		
			stack = (struct stackstruct *)malloc(sizeof(struct stackstruct));
			stack->id = p->id;
			stack->time = p->time;
			stackend2->next = stack;
			stack->pre = stackend2;
			stack->next = NULL;
			stackend2 = stack;
		
		stack2count++;
	

/*
弹出一个元素,找和离开车牌相同的车,找到则输出费用,返回空,否则返回弹出的元素
*/
struct stackstruct *pop(int id, int time,int money)

	struct stackstruct *stack;
	stack = (struct stackstruct *)malloc(sizeof(struct stackstruct));

	if (stackend1->id != id)
	//该元素与离开车辆不同,则单纯弹出元素
		stack->id = stackend1->id;
		stack->time = stackend1->time;
		stack->pre = stackend1->pre;
		free(stackend1);
		stackend1 = stack->pre;
		stackend1->next = NULL;
		stack1count--;
	
	else
	//找到离开车辆所在元素,输出车辆、费用信息
		stack->id = stackend1->id;
		stack->time = stackend1->time;
		stack->pre = stackend1->pre;
		printf("%d号汽车出停车场\\n", id);
		printf("停车场停留时间: %d\\n", time - stack->time);
		if((time - stack->time) > 0) printf("应该缴纳的费用(单价: %d): %d\\n",money, money * (time - stack->time));
		else printf("应该缴纳的费用(单价: %d): 0\\n",money);
		free(stackend1);
		if (--stack1count == 0)
			stackend1 = stackhead1 = NULL;
		else
		
			stackend1 = stack->pre;
			stackend1->next = NULL;
		
		stack = NULL;
	
	return stack;

/*
弹出临时栈的一个元素并返回
*/
struct stackstruct *pop1()

	struct stackstruct *stack;
	stack = (struct stackstruct *)malloc(sizeof(struct stackstruct));

	stack->id = stackend2->id;
	stack->time = stackend2->time;
	stack->pre = stackend2->pre;
	free(stackend2);
	stackend2 = stack->pre;
	stack2count--;

	return stack;

/*
停车场满,入队列操作
*/
void Enqueue(struct stackstruct *p)

	struct queuestruct *queue;//临时结点
	if (queuecount == 0)
	
		queuehead = (struct queuestruct *)malloc(sizeof(struct queuestruct));
		queuehead->id = p->id;
		queuehead->next = NULL;
		queueend = queuehead;
	
	else
	
		queue = (struct queuestruct *)malloc(sizeof(struct queuestruct));
		queue->id = p->id;
		queue->next = NULL;
		queueend->next = queue;
		queueend = queue;
	
	queuecount++;

//出队列操作,返回弹出的元素
struct stackstruct *Dequeue(int time)

	struct stackstruct *stack;
	stack = (struct stackstruct *)malloc(sizeof(struct stackstruct));

	stack->id = queuehead->id;
	stack->time = time;
	if (--queuecount == 0)
	
		queuehead = NULL;
		queueend = NULL;
	
	else
		queuehead = queuehead->next;
	return stack;

int main()

	int n;//储存停车场车位
	char s;//储存进入/驶出信息
	struct stackstruct *p;//储存汽车信息
	int money;//储存单价
        printf("《停车场管理》\\n");
	printf("输入停车场可停放汽车数量: ");
	scanf("%d", &n);
	getchar();
	printf("请输入停车费用单价:\\n");
	scanf("%d",&money);
	getchar();
	printf("请输入车辆信息,格式:A/D,车牌,到达时刻,其中A为到达,D为离开,输入E,0,0结束\\n");
	stack1count = stack2count = queuecount = 0;
	p = (struct stackstruct *)malloc(sizeof(struct stackstruct));

	while (scanf("%c,%d,%d", &s, &p->id, &p->time) != EOF)
	
		getchar();
		if (s == 'E')
			break;
		else if (s == 'A')                /*汽车到达*/
		
			if (stack1count < n)                 /*栈未满,进栈操作*/
			
				push(0, p);
				printf("%d号汽车进入停车场\\n", stackend1->id);
				printf("进入停车场时间: %d\\n", stackend1->time);
				printf("停车位置: %d\\n", stack1count);
			
			else                                /*栈满,进队列操作*/
			
				Enqueue(p);
				printf("%d号汽车进入便道\\n", p->id);
				printf("进入便道时间: %d\\n", p->time);
				printf("便道位置: %d\\n", queuecount);
			
		
		else if (s == 'D')                /*汽车离去*/
		
			struct stackstruct *temp;
			while ((temp = pop(p->id, p->time,money)) != NULL)
			
				push(1, temp);//返回的元素不为空则没找到,存入临时栈中
			//搜索到了则退出循环
			while (stack2count != 0)
			
				push(0, pop1());//将临时栈中的元素存回停车场栈
			
			if (queuecount != 0)
			//便道上有等待车辆时进入停车场并计时
				push(0, Dequeue(p->time));
				printf("%d号汽车进入停车场\\n", stackend1->id);
				printf("进入时刻: %d\\n", stackend1->time);
				printf("停车位置: %d\\n", stack1count);
			
		
	
	return 0;


四、调试分析

  1. 本次实验实现的是停车场管理系统模拟,通过栈模拟停车场,队列模拟在外等待的车辆.
  2. 在弹出停车场栈的时候要判断元素是否与离开车辆信息相符,不相符则存入临时栈等待,等找到离开车辆时再弹出临时栈,加入队列的一个元素并复原。

五、用户手册

1.本程序的执行文件为:Parking.exe
2.进入演示程序后,将显示如下的界面

3.输入停车场可停放汽车数量、费用单价和车辆信息(车辆信息输入格式:A/D,车牌,到达时刻,其中A为到达,D为离开,输入E,0,0结束)

4.当离开时刻在进入时刻之前,时间为负,此时应交费用为0.

六、测试结果

2,3号车辆进入停车场,输出信息

4号车辆进入时停车场已满,进入便道
3号车辆驶出输出费用,4号车辆进入停车场

以上是关于数据结构 停车场管理的主要内容,如果未能解决你的问题,请参考以下文章

7-3 停车场管理 (20point(s))

栈与队列的应用:停车场管理

顺序栈和链队列

Java使用栈和队列模拟停车场问题

SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

SDUT 2088 数据结构实验之栈与队列十一:refresh的停车场