停车场管理系统详细解析-数据结构课题(巩固加深理解)

停车场管理系统详解

问题

请你设计一个停车场方案,停车场只能存放车辆7辆,候车场只能存放车辆3辆。按你所学,以c语言代码设计之。

思路

  1. 候车场是队列结构,先进先出。
  2. 停车场为顺序栈结构,后进先出。
  3. 逻辑思路与进一步整理。

初步设计方案

  1. 指示门结构
  2. 循环队列
  3. 顺序栈
  • 指示门结构
struct Door{
	bool indoor,backdoor;/*---定义便道门和停车场门结构---*/ 
	}door;
  • 循环队列结构

1.InitialQueue()&&enQueue();------初始化并进队操作: 队列指示门开 >进队>------队列指示门关 >反馈停车场&候车场均满载信息

void enQueue(Queue*q,int e){
	//当便道队列满载时 
if((q->rear+1)%QUEUESIZE == q->front){
printf("\t\t >>便道内车辆已经满载!请稍等!\n"); 
}
//进队 
 q->rear =(q->rear+1)%QUEUESIZE;
 q->carNo[q->rear] = e;
 //当进队后队满
 if((q->rear+1)%QUEUESIZE == q->front)
 door.indoor = 0;                /*---将便道门置关状态---*/
}

2.deQueue();------出队操作:队列指示门开>判断非空?反馈 : 元素出队

  void deQueue(Queue*q,int *e){
	if(q->front == q->rear)
	return;                            //没有车辆不执行直接return
	/*---先赋值,再移动指针*/ 
    *e = q->carNo[q->front];
	q->front = (q->front +1)%QUEUESIZE;
	door.indoor = 1;         /*---当有车辆出队时,便道门置开---*/ 
   }

3.DisQueue();------显示候车场信息:由队头开始输出元素直至队尾

void DisQueue(Queue*q)
	{
	//满载反馈 
	if((q->rear+1)%QUEUESIZE == q->front)
	{
	printf("\t\t >>便道车辆已经满载,请换停!!\n");
	}
  	  //空反馈 
	if(q->front == q->rear)
	 {
	printf("\t\t >>候车场为空!!\n");
	return;
  	  }
 		//非空反馈
	int i,count=0;	//count计数 
	i=(q->front)%QUEUESIZE;	//定位队头指针 
     while((q->rear-i+QUEUESIZE)%QUEUESIZE>0)	//当对头指针后面仍然有元素 
	{
		printf("\t\t >>车牌号%d在便道中等待!\n",q->carNo[i]);
		i++;	//指针加1 
		count++;
   	 } 
  	 printf("\t\t **目前候车场车辆为%d辆\n",count); 
	 }
  • 顺序栈

1.InitialStack()&&Push();------------初始化并进栈操作:栈指示门关?>return : 进栈 进栈后判断栈顶是否满载?>栈指示门置1(区别:栈满置1) : return

  int Push(Stack*s,int e1,int e2)
	{   //满载反馈 
	if(door.backdoor ==1)
	 {
	return 0;
 		}
	//非空反馈 
	else
	{
	//先移动头指针
	s->top++; 
		//---依次将车牌号和到达时间记录到到达栈中
	s->carNo[s->top]=e1; 
	s->carTime[s->top]=e2;
	if(s->top  ==(STACKSIZE-1))
	door.backdoor = 1;/*---出站即将停车场指示门置 1(关)---*/
	}	
	}

2.Pop();---------------------------出站操作:栈非空?>出栈 : return

int Pop(Stack *s,int *e1,int *e2)
		{   //空反馈 
 		if(s->top ==-1)
		 {
 		printf("\t\t >>停车场内无车辆!\n");
	   	 return 0;
		 }
		//e1,e2指针记录它的车牌信息和---ARIVETIME--- 
		//先赋值再移动指针
 		*e1 =s->carNo[s->top];
 		*e2 =s->carTime[s->top];
 		s->top--; 
 		door.backdoor = 0;/*---出站即置开---*/ 
		 }

3.DisStack();------------------ 显示停车场:栈空?return : 出栈

void DisStack(Stack*s)
	{
	int i,count=0;
	//满载反馈 
	if(door.back == 1)
	{
  	printf("\t\t >>停车场已经满载!\n");
	}
	//非空反馈 
	if(s->top!=-1){
	for(i=s->top;i>=0;i--){
	printf("\t\t >>车牌号:%d的到达时间是:%d\n",s->carNo[i],s->carTime[i]);
	count++;}//记录到达停车场的车辆个数
	printf("\t\t **目前停车场内车辆为:%d辆\n",count);
 	}
	//空反馈 
	else{
	printf("\t\t >>停车场内无车辆!\n");
	}
	}
	```
  • 主函数

代码演示

/********题目要求:
   1.停车场最多存在车辆7辆
   2.便道内最多存在车辆3辆
   3.当停车场内车辆停满,进来的车辆只能在便道里等待
   4.当便道里车辆停满,不准车辆进站
************/

#include <stdio.h>/*输入输出流*/ 
#include <malloc.h>/*为指针开辟空间*/ 
#define  STACKSIZE 7/*停车场最大可停车辆*/ 
#define  QUEUESIZE 4/*便道最大可停车辆为3*/ 
#define  PRICE 3/*每小时停车费用*/

//*******************************//
/*创建门结构
  case 1:indoor == true(false) ---指示便道未满
  case 2:backdoor == false(true) --指示便道已满*/
struct Door{
	bool indoor,backdoor;/*---定义便道门和停车场门结构---*/ 
}door;

//*******************************//
/*停车场结构体
  1.carNo[STACKSIZE]记录最多能够停的停车场内车辆的车牌号 
  2.carTime[STACKSTZE]记录最多能够停的停车场内车辆的时间
  3.top栈指针*/ 
typedef struct{
  	int carNo[STACKSIZE];
  	int carTime[STACKSIZE];
  	int top;
}Stack;

//*******************************// 
/*便道结构(非循环队列)
  1.carNo[QUEUESIZE]记录最多便道内可停车辆的车牌号信息
  2.front队头指针*/  
typedef struct{
	int carNo[QUEUESIZE];
	int front,rear;
}Queue; 

//以下为主要操作函数
// 
/*初始化便道门信息*/ 
int InitialDoor(){
	door.indoor = 1;/*---初始化便道门的状态1为开---*/  
	door.backdoor = 0;/*---初始化停车场门不满的状态为0---*/ 
	return 1;
}
/*查看便道门的开关信息*/ 
void DisDoor(){
	if(door.indoor == 0)
	{
		printf("\t\t ---便道内车辆已满载,请换停!---\n");
	} 
	else
	{
		printf("\t\t****便道门已经打开,请慢走哦!****\n");
		if(door.backdoor == 1)
		{
		printf("\t\t ---停车场已经满载!请确认您的下一步---:\n");
	    }
	    else
		{
		printf("\t\t***停车场未满可以停车***\n");
	    }
	}
	
} 
/*初始化便道顺序队列*/ 
void IniQueue(Queue*q)
{
	 q->front = q->rear=0;
}
/*进入便道队列操作*/  
void enQueue(Queue*q,int e)
{
	//当便道队列满载时 
    if((q->rear+1)%QUEUESIZE == q->front)
	{
		return;
    }
	//进队 
    q->carNo[q->rear] = e;
    q->rear =(q->rear+1)%QUEUESIZE;
    if((q->rear+1)%QUEUESIZE == q->front)
    door.indoor = 0;/*---将便道门置关状态---*/
}
/*出队操作*/  
void deQueue(Queue*q,int *e)
{   //没有车辆不执行
	if(q->front == q->rear) 
		return;
	*e = q->carNo[q->front];/*---先赋值,再移动指针*/ 
	q->front = (q->front +1)%QUEUESIZE;
	door.indoor = 1;/*---当有车辆出队时,便道门置开---*/ 
} 
/*显示候车场*/ 
void DisQueue(Queue*q)
{
	//满载反馈 
	if((q->rear+1)%QUEUESIZE == q->front)
	{
		printf("\t\t >>便道车辆已经满载,请换停!!\n");
	}
	    //空反馈 
		if(q->front == q->rear)
	    {
		printf("\t\t >>候车场为空!!\n");
		return;
	    }
     	//非空反馈
	    int i,count=0;//count计数 
		i=(q->front)%QUEUESIZE;//定位队头指针 
        while((q->rear-i+QUEUESIZE)%QUEUESIZE>0)//当对头指针后面仍然有元素 
		{
    	printf("\t\t >>车牌号%d在便道中等待!\n",q->carNo[i]);
    	i++;//指针加1 
    	count++;
	    } 
	    printf("\t\t **目前候车场车辆为%d辆\n",count); 
 }
/*初始化停车场*/ 
void IniStack(Stack*s)
{
	s->top = -1;
}
/*进栈操作*/ 
int Push(Stack*s,int e1,int e2)
{   //满载反馈 
 	if(s->top ==(STACKSIZE-1))
	 {
		return 0;
     }
	//非空反馈 
	else
	{
	//先移动头指针
	s->top++; 
    //---依次将车牌号和到达时间记录到到达栈中
 	s->carNo[s->top]=e1; 
 	s->carTime[s->top]=e2;
	if(s->top ==(STACKSIZE-1))
	door.backdoor = 1;/*---将停车场指示门置 1(关)---*/
    }	
}
/*出栈操作*/ 
int Pop(Stack *s,int *e1,int *e2)
{   //空反馈 
 	if(s->top ==-1)
	 {
 		printf("\t\t >>停车场内无车辆!\n");
	    return 0;
	 }
	//e1,e2指针记录它的车牌信息和---ARIVETIME--- 
 	*e1 =s->carNo[s->top];
 	*e2 =s->carTime[s->top];
 	s->top--; 
 	door.backdoor = 0;/*---出站即置开---*/ 
 }
 /*显示停车场*/  
void DisStack(Stack*s)
{
 	int i,count=0;
 	//满载反馈 
 	if(s->top == (STACKSIZE-1))
 	{
 	  printf("\t\t >>停车场已经满载!\n");
	}
	//非空反馈 
 	if(s->top!=-1){
 		 	for(i=s->top;i>=0;i--){
 				printf("\t\t >>车牌号:%d的到达时间是:%d\n",s->carNo[i],s->carTime[i]);
 				count++;}//记录到达停车场的车辆个数
 			printf("\t\t **目前停车场内车辆为:%d辆\n",count);
	 }
	 //空反馈 
    else{
 		printf("\t\t >>停车场内无车辆!\n");
	 }
 	
 }
int main()
  {
	Stack arrcar,depacar;//创建到达栈和离开栈变量 
	Queue qcar;//创建便道变量 
	/*---将指针q s1&s2指向对应变量---*/ 
	Stack *s1 = &arrcar;  
	Stack *s2 = &depacar;  
	Queue *q = &qcar;
	int  no,time;
	int e1,e2;
	int i,m,n;
	int sum,input;
	/*初始化 便道&停车场s1,s2&便道门*/ 
	IniQueue(q);
	IniStack(s1);
	IniStack(s2);
	InitialDoor(); 
	//指令操作 
	  do{ 
		printf("\n\n\t\t*****请选择*****\n");
	    printf("\t\t0:退出\n");
	    printf("\t\t1:进站?\n");
	    printf("\t\t2:出站\n");
	    printf("\t\t3:查询\n");
	     scanf("%d",&input);
	    		switch(input){
	    			case 0:
	    				printf("\t\t >>行车不规范亲人两行泪,请慢走!!\n"); 
					continue;
	    			case 1:
	    				DisDoor();
	    					/*case 2.0:停车场已满,便道未满---在便道中停留---*/
						if(door.backdoor == 1&&door.indoor == 1)
						{
							DisStack(s1);
							printf("\t\t >>请输入你的车牌号:\n");
	    				    scanf("%d",&no);
							enQueue(q,no);
							DisQueue(q);
						}
						/*case 1.0:停车场不满---直接进入**停车场**不在便道中等待---*/ 
	    				if(door.backdoor == 0&&door.indoor ==1) 
						{
						printf("\t\t确认你的车牌号和到达时间:\n");
						 scanf("%d%d",&no,&time);
						Push(s1,no,time);
						printf("\t\t ***目前停车场内车辆信息:\n");
						DisStack(s1);
				    	}
						/*case 2.1:停车场已满,便道已满*/  
						if(door.backdoor == 1&&door.indoor == 0)
						{
							printf("\t\t >>这里已经由于满载不能停车了哟!\n");
						}				    
						break;
					case 2:	
					    printf("\t\t选择你的车牌号和离开时间:\n");
					    scanf("%d%d",&no,&time);
					     /*---在到达栈中查找元素---*/ 
						for( i = 0; i<=s1->top && s1->carNo[i]!=no; i++); 
						if(s1->carNo[i]!=no) 
						{
						 printf("\t\t >>请再次确认您的车牌号信息是否有误!\n");
						}
						 /*---s1 找到元素 carNO[i] ---*/ 
					    else{
							m = s1->top-i;/*--需要将排在该车辆前面的车辆  m 临时导入离开栈 s2 中---*/ 
							//导出操作 
							for(n=0;n<m;n++)
							{
								//e1--车牌信息,e2--到达时间为临时变量,指示临时出栈的车辆--*无关?*--信息 
								Pop(s1,&e1,&e2);/*---到达栈 s1 中 m 个元素开始出栈---*/  
								Push(s2,e1,e2);/*---将这些元素临时导入离开栈 s2 中---*/ 
							}
							//关键点 
							Pop(s1,&e1,&e2);/*---指定元素 carNo[i] 开始出栈---*/ 
							 //开始收费 
							sum =(time-e2)*PRICE; 
							printf("\t\t >>车牌号为 %d 的此次停车总计费为 %d 元!请慢走哦!\n",no,sum);
							while(s2->top!=-1)
							{
								/*---将临时导出的离开栈 s2 中元素返回到达栈 s1 中---(信息不改变)---*/
								    Pop(s2,&e1,&e2);  
							     	Push(s1,e1,e2);  
							}
							//此时便道内有车辆则可以进入停车场 
							if(q->front!=q->rear)
							{
							 /*---便道内队头车辆开始进站---*/
								deQueue(q,&e1); /*出队*/ 
								Push(s1,e1,time);/*进站---**出现问题**---*/ 
							} 
						}
					    break;
					case 3:
						 /*便道信息和停车场信息一并显示*/
//						DisDoor();
				        //--1--停车场未满,便道未满  
						if(door.backdoor == 0)
						{
							if(door.indoor == 1){
							DisStack(s1);
							DisQueue(q);	
							} 	
						}
						//--2--停车场已满,便道未满 or满载
					    else
						{
							if(door.indoor == 1)
							{
							 DisStack(s1);
							 DisQueue(q);
							} 
							else
							{
								DisStack(s1);
							    DisQueue(q);
								printf("\t\t >>请换停!\n");
							}
							 
						}
					    break;
					default:
					    printf("\t\t >>您的输入有误,请重新输入:\n");
						break; 
				}
	    }while(input!=0);
        return 0; 
}

结果展示

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

在这里插入图片描述

关于代码定义与使用部分,还有很多优化,笔者因为是19年课设,基本照搬课本,当基本的学习~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值