停车管理系统
//停车管理系统:注以栈模拟停车场,以顺序队模拟候车场#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;
}
int stackempty(sqstack *s) //判栈空
{return (s->top==-1);}
int stackfull(sqstack *s) //判栈满
{return (s->top==N-1);}
int push(sqstack *s,int x1,int x2) //进栈
{ if (s->top ==N-1)
return 0;
else
s->top ++;
s->CarNo[s->top]=x1;
s->CarTime [s->top ]=x2;
return 1;
}
int pop(sqstack *s,int x1,int x2) //出栈
{ if(s->top ==-1)
return 0;
else
x1=s->CarNo[s->top--];
x2=s->CarTime[s->top--];
return 1;
}
void dispstack(sqstack *s) //从栈顶到栈底输出元素
{
int i;
for (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;
}
int queueempty(sqqueue *q) //判队列空
{
if(q->front==q->rear)
return 1;
else
return (q->front==q->rear);
}
int queuefull(sqqueue *q) //判队满
{
if((q->rear +1)%M==q->front )
return 1;
else
return ((q->rear +1)%M==q->front);
}
int enqueue(sqqueue *q,int x) //进队
{
if((q->rear +1)%M==q->front )
return 0;
else
{
q->rear =(q->rear +1)%M;
q->CarNo[q->rear]=x;
return 1;
}
}
int outqueue(sqqueue *q,int x) //出队列
{
if(q->front ==q->rear)
return 0;
else
q->front =(q->front +1)%M;
x=q->CarNo[q->front];
return 1;
}
void dispqueue(sqqueue *q)
{
int i;
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");
}
void main()
{
int choice;
int no,x1,time,x2;
int i,j;
sqstack *st,*st1;
sqqueue *qu;
initstack(st);
initstack(st1);
initqueue(qu);
while(choice)
{
printf("输入指令(1:到达 2:离开 3:停车场 4:便道 0:退出):\n");
scanf("%d%d%d",&choice,&no,&time);
switch(choice)
{
case 1:
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(">>便道已满,不能停车:");
}
break;
case 2:
for(i=0;i<=st->top &&st->CarNo[i]==no;i++)
if(i>st->top )
printf(">>未找到该编号汽车");
else
{
for(j=i;j<st->top ;j++)
{
pop(st,x1,x2);
push(st1,x1,x2); //st1为临时栈
}
pop(st,x1,x2); //该汽车离开
printf(">>%d汽车停车费用:%d\n",no,(time-x2)*price);
while(!stackempty(st1))
{
pop(st1,x1,x2);
push(st,x1,x2);
}
if(!queueempty(qu))
{
outqueue(qu,x1);
push(st,x1,time);
}
}
break;
case 3:
if(!stackempty(st))
{
printf(">>停车场中的为车辆:");
dispstack(st);
}
else
printf(">>停车场无车辆");
break;
case 4:
if(!queueempty(qu))
{
printf(">>便道上的车辆为:");
dispqueue(qu);
}
else
printf(">>便道上无车辆:");
break;
case 0:
if(!stackempty(st))
{
printf(">>停车场中的为车辆:");
dispstack(st);
}
if(!queueempty(qu))
{
printf(">>便道上的车辆为:");
dispqueue(qu);
}
break;
default:
printf(">>输入的命令错误:");
break;
}
}
}
设有一个可停放N辆汽车的狭长汽车厂,只有一个大门供车辆出入,车辆按先后到达顺序从最里面向大门口停放,如果以放满N辆汽车,再来的车辆只能放在候车场里,一旦有汽车从停车里离开,排在候车场里的汽车便可以依次进入停车场。停车场中的某辆汽车要离开,在它之后进入停车场的都要让路,使他退出停车场,等该车离开后,其他车辆按原来的次序进入停车场。每辆车载离开时都要收费,停在候车场里的不用收费,在候车场里车辆保持原来的次序。
。。内存错误,,帮忙看下