📄 fan.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
struct car
{
int num;
int intime;
int outtime;
};//停车场内的汽车
struct stack
{
car *base;
car *top;
int stacksize;
};//车库
struct QNode
{
car data;
QNode* next;
};//通道上的汽车
struct Queue
{
QNode *front;
QNode *rear;
};//通道
void Input(car * car2 ,char x,int o)
{
printf("车状态:%c\n",x);
printf("汽车牌号:%d\n",car2->num);
printf("汽车停留的时间(小时):%d\n",car2->outtime-car2->intime);
printf("汽车收费:%d元\n",(car2->outtime-car2->intime)*o);
}
int InitStack(stack &s)
{
s.base=(car *)malloc (STACK_INIT_SIZE *sizeof(car));
if(!s.base) exit(-1);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 1;
}//构造空栈
int Push(stack *s,car &car1)
{
if(s->top-s->base >= s->stacksize)
printf("车库已满,外面等待\n");
*s->top++=car1;
return 1;
}//进车库
int Pop(stack *s,car &car1)
{
if(s->top==s->base) return ERROR;
car1=*(--s->top);
return OK;
}//出栈顶
int OutPopIn(stack *s1, stack *s2,car *car2,car *car1,int i,int n)
{
int m=n;
for(;i<n;n--)
{
Pop(s1,*car1);
Push(s2,*car1);//进入临时停车区
}
Pop(s1,*car2);
for(;i<m;m--)
{
Pop(s2,*car1);
Push(s1,*car1);//从临时停车区返回
}
return OK;
}//出栈的任意元素
int InitQueue(Queue &q)
{
q.front=q.rear=(QNode *)malloc(sizeof(QNode));
if(!q.front) exit(-1);
q.front->next=NULL;
return 1;
}//构造空队列
int EnQueue(Queue *q,QNode &car2)
{
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
*p=car2;
p->next=NULL;
q->rear->next=p;
q->rear=p;
return OK;
}//插入队列元素
int DeQueue(Queue *q,QNode &car1)
{
QNode *p;
if(q->front==q->rear) printf("待行区无车\n");
else
{
p=q->front->next;
car1=*p;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
}
return OK;
}//出队列
int outQueue(Queue *q,QNode &car2,QNode &car1,int n,int m)
{
int i;
QNode *p;
p=q->front->next;
for(i=1;i<n;i++)
{
DeQueue(q,car1);
EnQueue(q,car1);
}
DeQueue(q,car2);
for(;i<m;i++)
{
DeQueue(q,car1);
EnQueue(q,car1);
}
return OK;
}//出队列的任意元素
int main(void)
{
stack s1,s2;//s1表示车库,s2表示临时车库
Queue q3;//表示停车便道
car car1,car2;
QNode car3,car4;
QNode *Q1;
int d,o,c,e;
char x,y;
int n=0,m=1,a=0,b=0;
InitStack(s1);//车库
InitStack(s2);//等车区
InitQueue(q3);//通道
printf("********************************车库管理系统*****************************\n");
printf("请输入车库的容量:");
scanf("%d",&s1.stacksize);
printf("请输入汽车收费单价:");
scanf("%d",&o);
while(1){
printf("请输入汽车状态('A'表示到达,'D'表示离去,'E'表示输入结束):");
scanf("%c",&x);
if(x=='A')//进车
{
Q1=&car3;
printf("请输入汽车牌号:");
scanf("%d",&car3.data.num);
EnQueue(&q3,car3);
if(s1.top-s1.base<s1.stacksize)
{
DeQueue(&q3,car4);
printf("请输入该车进入车库的时间:");
scanf("%d",&car4.data.intime);
Push(&s1,car4.data);
n=s1.top-s1.base;
printf("车库停车位为:%d\n",n);
}
else if(s1.top-s1.base==s1.stacksize)
{
c=a-b-s1.stacksize;
m=c;
printf("车库已满,外面等待,便道停车位为:%d\n",++m);
}
a++;
}
else if(x=='D')//出车
{
printf("车库中的车离开请输入S,待行区车离开请输入Q:");//为什么此处不能如此?
scanf("%c",&y);
if(y=='S')
{
if(s1.top==s1.base)
printf("车库内无车\n");
else
{
printf("要出车库的车的停车位:");
scanf("%d",&d);
if(s1.top-s1.base>d)
{
OutPopIn(&s1,&s2,&car2,&car1,d,s1.top-s1.base);
printf("请输入该车离开车库的时间:");
scanf("%d",&car2.outtime);
Input(&car2,x,o);
}
else
{
Pop(&s1,car2);
printf("请输入该车离开车库的时间:");
scanf("%d",&car2.outtime);
Input(&car2,x,o);
}
b++;
if(q3.front!=q3.rear&&s1.top-s1.base<s1.stacksize)
{
DeQueue(&q3,car4);
car4.data.intime=car2.outtime;
printf("待行区一号车位进车库\n");
printf("该车进入车库的时间为%d\n:",car4.data.intime);
Push(&s1,car4.data);
}
}
}
else if(y=='Q')
{
if(q3.front==q3.rear)
printf("待行区内无车\n");
else
{
printf("请输入要离开待行区车的停车位:");
scanf("%d",&e);
if(e==1)
DeQueue(&q3,car4);
else
outQueue(&q3,car4,car3,e,q3.front-q3.rear);
printf("车已成功离开\n");
b++;
}
}
}
else if(x=='E') break;
else printf("请重新输入\n");
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -