📄 park.c
字号:
/* 标准文档模板 */
#include "Stdio.h"
#include "Conio.h"
/* 停车场管理的简单模拟 */
#define N 4 /* 停车场容量 */
#define M 5 /* 收费单价/单位时间 */
#define True 1
#define False 0
#define Null 0
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct element
{
int num;
int arrtime;
} ElemType;
typedef struct stacktag
{
ElemType stack[N];
int top;
} STACK;
typedef struct nodetag
{
int num;
struct nodetag *next;
} QUEUE;
typedef struct queuetag
{
QUEUE *front,*rear;
}LinkedQueTp;
void IniStack(STACK *s);
int Push(STACK *s,ElemType x);
ElemType Pop(STACK *s);
void IniLinkedQue(LinkedQueTp *s);
void EnLinkedQue(LinkedQueTp *s,int num1);
int DeLinkedQue(LinkedQueTp *s);
void Arrive(STACK *s1,LinkedQueTp *p,ElemType x);
void Delive(STACK *s1,STACK *s2,LinkedQueTp *p,ElemType x);
void IniStack(STACK *s)
{
s->top=-1;
return;
}
int Push(STACK *s,ElemType x)
{
int mytop;
if(s->top==N-1)
{
printf("\nStack Overflow!\n");
return (False);
}
else
{
mytop=s->top;
mytop++;
s->stack[mytop]=x;
s->top=mytop;
return (True);
}
}
/* Initialize Stack */
ElemType Pop(STACK *s)
{
ElemType x;
int i;
if(s->top<0)
{
x.num=Null;
x.arrtime=Null;
return (x);
}
else
{
s->top--;
i=s->top+1;
x=s->stack[i];
return x;
}
}
/* Pop */
void IniLinkedQue(LinkedQueTp *s)
{
QUEUE *p1;
s->front=(QUEUE *)malloc(sizeof(QUEUE));
s->rear=s->front;
p1=s->front;
p1->next=Null;
p1->num=0;
}
/* IniLinkedQue */
void EnLinkedQue(LinkedQueTp *s,int num1) /* 数据入队列(链接式循环队列) */
{
QUEUE *p,*p1;
p=(QUEUE *)malloc(sizeof(QUEUE)); /* 产生一个新节点 */
p->num=num1;
p->next=Null;
p1=s->rear; /* 加入队尾 */
p1->next=p;
s->rear=p;
p1=s->front;
p1->num++;
}
/* EnLinkedQue */
int DeLinkedQue(LinkedQueTp *s) /* 数据节点出队列 */
{
QUEUE *p;
int n;
if(s->front==s->rear) return (Null);
else
{
p=s->front->next;
s->front->next=p->next;
if(p->next==Null)
s->rear=s->front;
n=p->num;
free(p);
s->front->num--;
return (n);
}
}
/* DeLinkedQue */
void Arrive(STACK *s1,LinkedQueTp *p,ElemType x)
/* 车辆到达处理 */
{
int f,no1,no2;
f=Push(s1,x); /* 新到车辆进入停车场栈 */
if(f==False) /* 如停车场满, 就进入便道队列等待 */
{
EnLinkedQue(p,x.num);
no1=p->front->num;
printf("第%d号车停在便道的第%d号车位上\n",x.num,no1);
}
else /* 新到车辆进入停车场 */
{
no1=s1->top+1;
no2=x.num;
printf("第%d号车停在停车场的第%d号车位上\n",no2,no1);
}
}
/* Arrive */
void Delive(STACK *s1,STACK *s2,LinkedQueTp *p,ElemType x)
/* 离开处理 */
{
int n,f=False;
ElemType y;
QUEUE *q;
while((s1->top>-1) && (f!=True)) /* 在停车场中寻找要离开的车辆 */
{
y=Pop(s1);
if(y.num!=x.num) /* 如果栈顶元素不是要离开的车辆,就将其放如车辆规闭所*/
n=Push(s2,y);
else f=True;
}
if(y.num==x.num) /*在停车场中找到要离开的车辆*/
{
printf("第%d号车应收费%d元",y.num,(x.arrtime-y.arrtime)*M);
while(s2->top>-1)
{
y=Pop(s2);
f=Push(s1,y);
}
n=DeLinkedQue(p);
if(n!=Null) /* 有车在队列中等待 */
{
y.num=n;
y.arrtime=x.arrtime;
f=Push(s1,y);
printf("第%d号车停在停车场第%d号车位上\n",y.num,s1->top+1);
}
}
else/*在停车场中没有找到要离开的车辆*/
{
while(s2->top>-1)
{
y=Pop(s2);
f=Push(s1,y);
}
q=p->front; /* 指向队头 */
f=False;
while(f==False && q->next !=Null) /*在便道上寻找要离开的车辆*/
if(q->next->num!=x.num)
q=q->next;
else
{
q->next=q->next->next; /*在便道上找到该车辆*/
p->front->num--;
if(q->next==Null)
p->rear=p->front;
printf("第%d号车离开便道\n",x.num);/*该车离开便道,但不收费*/
f=True;
}
if(f==False)
printf("输入数据错误,停车场和便道上均无第%d号车\n",x.num);
}
}
void main()/* 停车场模拟管理程序 */
{
char ch1,ch2;
STACK *s1,*s2;
LinkedQueTp *p;
ElemType x;
int flag,t1,t2;
s1=(STACK *)malloc(sizeof(STACK));
s2=(STACK *)malloc(sizeof(STACK));
p=(LinkedQueTp *)malloc(sizeof(LinkedQueTp));
IniStack(s1); /* 初始化停车场栈 */
IniStack(s2); /* 初始化车辆规避所栈 */
IniLinkedQue(p);/* 初始化便道队列 */
flag=True;
for(;;)
{
printf("\n输入数据:'A'/'D',车牌号,到达时间/离开时间\n");
printf("E---退出。\n");
scanf("%c,%d,%d",&ch1,&t1,&t2);
x.num=t1;
x.arrtime=t2;
ch2=getchar();
switch(ch1)
{
case 'a':
case 'A': Arrive(s1,p,x);
printf("\nPress any key to continue...\n");
getch();
break;
case 'd':
case 'D': Delive(s1,s2,p,x);
printf("\nPress any key to continue...\n");
getch();
break;
case 'e':
case 'E': flag=False;
printf("\n程序正常结束\n");
break;
default: printf("\n输入数据错误,重新输入\n");
printf("\nPress any key to continue...\n");
getch();
break;
}
if(flag==False) break;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -