停车场管理系统详解
问题
请你设计一个停车场方案,停车场只能存放车辆7辆,候车场只能存放车辆3辆。按你所学,以c语言代码设计之。
思路
- 候车场是队列结构,先进先出。
- 停车场为顺序栈结构,后进先出。
- 逻辑思路与进一步整理。
初步设计方案
- 指示门结构
- 循环队列
- 顺序栈
- 指示门结构
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年课设,基本照搬课本,当基本的学习~