目的:深入掌握栈和队列应用的算法设计
内容:编写满足以下要求的停车场管理程序exp3-5.cpp。设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序依次由南像北排列(大门在最北端,最先到达的第一辆车停放在停车场的最南端),若停车场内已停满n辆车,则后来的汽车只能在门外的便道(即候车场)上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内的某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场,每辆停放在停车场的车在它离开停车场时必须按停留的时间长短交纳费用。整个停车场的示意图如下图所示:
//计算机 小淇在敲代码 编写停车场管理程序
#include<stdio.h>
#include<malloc.h>
#define N 3 //停车场内最多的停车数
#define M 4 //候车场内最多的停车数
#define Price 2 //每单位停车费用
typedef struct
{
int CarNo[N]; //车号
int CarTime[N]; //进场时间
int top; //栈指针
}SqStack; //声明顺序栈类型
typedef struct
{
int CarNo[M]; //车号
int front,rear; //队首和队尾指针
}SqQueue; //声明环形队列类型
//栈的基本运算操作
//初始化栈
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
//判断栈空
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
//判断栈满
bool StackFull(SqStack *s)
{
return(s->top==N-1);
}
//进栈
bool Push(SqStack *&s,int e1,int e2)
{
if(s->top==N-1)
return false;
s->top++;
s->CarNo[s->top]=e1;
s->CarTime[s->top]=e2;
return true;
}
//出栈
bool Pop(SqStack *&s,int &e1,int &e2)
{
if(s->top==-1)
return false;
e1=s->CarNo[s->top];
e2=s->CarTime[s->top];
s->top--;
return true;
}
//显示栈中元素
void DispStack(SqStack *s)
{
for(int i=s->top;i>=0;i--)
printf("%d",s->CarNo[i]);
printf("\n");
}
//队列的基本运算操作
//初始化队
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}
//判断队空
bool QueueEmpty(SqQueue *q)
{
return(q->front==q->rear);
}
//判断队满
bool QueueFull(SqQueue *q)
{
return((q->rear+1)%M==q->front);
}
//进队
bool enQueue(SqQueue *&q,int e)
{
if((q->rear+1)%M==q->front) //队满
return false;
q->rear=(q->rear+1)%M;
q->CarNo[q->rear]=e;
return true;
}
//出队
bool deQueue(SqQueue *&q,int &e)
{
if(q->front==q->rear) //队空的情况
return false;
q->front=(q->front+1)%M;
e=q->CarNo[q->front];
return true;
}
//显示队中元素
void DispQueue(SqQueue *q)
{
int i=(q->front+1)%M;
printf("%d",q->CarNo[i]);
while((q->rear-i+M)%M>0)
{
i=(i+1)%M;
printf("%d",q->CarNo[i]);
}
printf("\n");
}
//主函数
int main()
{
int w,i,j;
int no,e1,time,e2,time1;
SqStack *St,*St1;
SqQueue *Qu;
InitStack(St);
InitStack(St1);
InitQueue(Qu);
printf("计算机 小淇在敲代码\n");
do
{
printf("1.到达\n2.离开\n3.停车场\n4.候车场\n0.退出\n 请输入: ");
scanf("%d",&w);
switch(w)
{
case 1:printf("车号 到达时间: ");
scanf("%d%d",&no,&time);
if(!StackFull(St)) //停车场不满
{
Push(St,no,time);
printf("停车场位置:%d\n",St->top+1);
}
else //停车场满
{
if(!QueueFull(Qu)) //候车场不满
{
enQueue(Qu,no);
printf("候车场位置:%d\n",Qu->rear);
}else
printf("候车场已满,不能停车\n");
}
break;
case 2:printf("车号 离开时间: ");
scanf("%d%d",&no,&time1);
while(time1<time)
{
printf("离开时间不能小于进入时间,请重新输入离开时间");
scanf("%d",&time1);
}
for(i=0;i<=St->top&&St->CarNo[i]!=no;i++);
if(i<St->top)
printf("未找到该编号的汽车\n");
else
{
for(i=i;i<=St->top;j++)
{
Pop(St,e1,e2);
Push(St1,e1,e2);
}
Pop(St,e1,e2);
printf("%d汽车停车费用:%d\n",no,(time1-e2)*Price);
while(!StackEmpty(St1))
{
Pop(St1,e1,e2);
Push(St,e1,e2);
}
if(!QueueEmpty(Qu))
{
deQueue(Qu,e1);
Push(St,e1,time);
}
}
break;
case 3:
if(!StackEmpty(St))
{
printf("停车场中的车辆: ");
DispStack(St);
}
else
printf("停车场中无车辆\n");
break;
case 4:
if(!QueueEmpty(Qu))
{
printf("候车场中的车辆: ");
DispQueue(Qu);
}
else
printf("候车场中无车辆:\n");
break;
case 0:
if(!StackEmpty(St))
{
printf("停车场中的车辆: ");
DispStack(St);
}
if(!QueueEmpty(Qu))
{
printf("候车场中的车辆: ");
DispQueue(Qu);
}
break;
default:
printf("输入的命令错误\n");
break;
}
}
while(w!=0);
return 0;
}