📄 3(ok).c
字号:
#include "stdio.h"
#include "time.h"
#include "malloc.h"
#define SIZE 5 //车位
//////////////////////////////////////////////////////////////////////////
//栈的数据结构描述
typedef struct
{
char flag;//进出标志
int num;//车牌号
int io_time;//进出时刻
}parkingNode;
typedef struct
{
parkingNode cars[SIZE];
int top;
}Carparking_Stack;
//////////////////////////////////////////////////////////////////////////
//新建并初始化栈
Carparking_Stack *SetStack()
{
Carparking_Stack *S;
S=(Carparking_Stack *)malloc(sizeof(Carparking_Stack));
S->top=-1;
return S;
}
//////////////////////////////////////////////////////////////////////////
//判栈空
int StackEmpty(Carparking_Stack *S)
{
if (S->top>=0)
return 0;
else
return 1;
}
//////////////////////////////////////////////////////////////////////////
//判栈满
int StackFull(Carparking_Stack *S)
{
if(S->top<SIZE-1&&S->top>=0)
return 0;
else
return 1;
}
//////////////////////////////////////////////////////////////////////////
//取栈顶元素
parkingNode *GetTop(Carparking_Stack *S)
{
if(S->top<=SIZE-1&&S->top>=0)
return &S->cars[S->top];
else
printf("error");
}
//////////////////////////////////////////////////////////////////////////
//入栈
Carparking_Stack *Push(Carparking_Stack *S,parkingNode *x)
{
if(S->top<SIZE-1&&S->top>=-1)
{
S->top++;
S->cars[S->top].flag=x->flag;
S->cars[S->top].num=x->num;
S->cars[S->top].io_time=x->io_time;
}
else
printf("error");
return S;
}
//////////////////////////////////////////////////////////////////////////
//出栈
Carparking_Stack *Pop(Carparking_Stack *S)
{
if (S->top>=0)
S->top--;
else
printf("error");
return S;
}
//////////////////////////////////////////////////////////////////////////
//循环队列数据类型定义
#define maxlen 100
typedef struct
{
parkingNode cars[maxlen];
int front;
int rear;
}Carparking_Queue;
//////////////////////////////////////////////////////////////////////////
//类似的,新建一个空队列:
Carparking_Queue *SetQueue()
{
Carparking_Queue *Q;
Q=(Carparking_Queue *)malloc(sizeof(Carparking_Queue));
Q->front=0;
Q->rear=0;
return Q;
}
//////////////////////////////////////////////////////////////////////////
//判队满
int QueueFull(Carparking_Queue *Q)
{
if (Q->front==(Q->rear+1)%maxlen)
return 1;
else
return 0;
}
//////////////////////////////////////////////////////////////////////////
//判队列空
int QueueEmpty(Carparking_Queue *Q)
{
if (Q->front==Q->rear)
return 1;
else
return 0;
}
//////////////////////////////////////////////////////////////////////////
//入队
Carparking_Queue *Add(Carparking_Queue *Q,parkingNode *x)
{
if (!QueueFull(Q))
{
Q->rear=(Q->rear+1)%maxlen;
Q->cars[Q->rear].flag=x->flag;
Q->cars[Q->rear].num=x->num;
Q->cars[Q->rear].io_time=x->io_time;
}
else
printf("Queue Full!!");
return Q;
}
//////////////////////////////////////////////////////////////////////////
//出队
Carparking_Queue *Delete (Carparking_Queue *Q)
{
if(!QueueEmpty(Q))
Q->front=(Q->front+1)%maxlen;
else
printf("Queue Empty!!");
return Q;
}
//////////////////////////////////////////////////////////////////////////
parkingNode *GetHead(Carparking_Queue *Q)//取队头元素
{
if (QueueEmpty(Q))
printf("the Queue is Empty!!\n");
else
return &Q->cars[(Q->front+1)%maxlen];
}
//////////////////////////////////////////////////////////////////////////
void yanshi()//延时效果函数,3秒
{
time_t tm1,tm2;
time(&tm1);
while (time(&tm2))
{
if (tm2-tm1==3)
break;
}
}
//////////////////////////////////////////////////////////////////////////
//收费
void charge(parkingNode *k)
{
int t;
char ch;
printf("\n请输入此车出场时间:");
scanf("%d",&t);
t=t-k->io_time;
printf("\n请输入车辆类型代码(A—轿车类\tB—货车类\tC—客车类): ");
while (1)
{
scanf("%c",&ch);
if(ch==0x0A)
continue;
else
break;
}
switch(ch)
{
case 'A':
printf("\t停车%d小时,费用:%d ¥!",t,10*t);
break;
case 'B':
printf("\t停车%d小时,费用:%d ¥!",t,7*t);
break;
case 'C':
printf("\t停车%d小时,费用:%d ¥!",t,5*t);
}
printf("\n\n");
}
//////////////////////////////////////////////////////////////////////////
//用户初始化栈
parkingNode *in()//??????如何有问题?????
{
parkingNode *k=(parkingNode *)malloc(sizeof(parkingNode));
printf("进出选择:(A-进,D-出): ");
while (1)
{
scanf("%c",&k->flag);
if(k->flag==0x0A)
continue;
else
break;
}
printf("车牌号: ");
scanf("%d",&k->num);
printf("进出时刻: ");
scanf("%d",&k->io_time);
return k;
}
void out(parkingNode *k)
{
printf("车牌号为: %d\n",k->num);
printf("入场停车的时间为: %d\n",k->io_time);
}
Carparking_Stack *input_stack(Carparking_Stack *S)//堆栈初始化
{
parkingNode *k;
char ch;
S=SetStack();
printf("用户初始化栈,输入停车场现况...\n");
ITEM:
while (1)
{
k=in();
S=Push(S,k);
printf("\n是否继续?(Y/N) :");
while (1)
{
scanf("%c",&ch);
if(ch==0x0A)
continue;
else
break;
}
if (ch=='Y'||ch=='y')
goto ITEM;
else
break;
}
return S;
}
//////////////////////////////////////////////////////////////////////////
//汽车入场停车
Carparking_Stack *car_in(Carparking_Stack *S,Carparking_Queue *Q)
{
parkingNode *k;
k=in();
if (StackFull(S))
{
printf("场内车位已满,将新来的车进入便道等候...\n");
Q=Add(Q,k);
}
/*else if (!StackFull(S)&&!QueueEmpty(Q))//场内还有空位,便道有车载等候
{
printf("场内尚有空位,将便道等候的车子入场...\n");
while (!StackFull(S))
{
k=GetHead(Q);
S=Push(S,k);
Q=Delete(Q);
}
}*/
else //便道无车等候,而且场内有空位
{
printf("场内尚有空位,直接入场...\n");
S=Push(S,k);
}
return S;
}
//////////////////////////////////////////////////////////////////////////
//汽车出场
Carparking_Stack *car_out(Carparking_Stack *S,Carparking_Queue *Q)
{
parkingNode *k;
Carparking_Stack *T;
int i,j,c=S->top;
T=SetStack();
ITEM_1:
printf("输入即将出场的车位号:\n");
scanf("%d",&i);
j=i;
if (i==c)
{
printf("此车位于最后一个车位,直接离去!!\n");
printf("\n=======车辆离开,请工作人员计算费用======\n");
k=GetTop(S);
charge(k);
S=Pop(S);
}
else if (i>c)
{
printf("尚无此车位!!重新输入!!\n");
goto ITEM_1;
}
else
{
printf("\n此车位于第%d号车位,下面先将其前面的%d个车位腾空...",j,c-j);
//延时效果
yanshi();
while((c-i)>0)
{
k=GetTop(S);
Pop(S);
T=Push(T,k);
i++;
}
printf("\n将第%d个车位的车子出场...\n",i);
k=GetTop(S);
////输出车子信息///////
out(k);
printf("\n=======车辆离开,请工作人员计算费用======\n");
charge(k);
yanshi();
S=Pop(S);//将第i个车位的车子出场
printf("\n要求出场的车子出场完毕,将被移出的车子再依次入场停放...\n");
yanshi();
while (!StackEmpty(T))
{
k=GetTop(T);
Pop(T);
S=Push(S,k);
}
if (!StackFull(S)&&!QueueEmpty(Q)) //将便道内的车辆入场
{
printf("此时场内已有空位,将便道内的车辆入场...\n");
yanshi();
while (!StackFull(S))
{
k=GetHead(Q);
S=Push(S,k);
Q=Delete(Q);
}
}
}
return S;
}
//////////////////////////////////////////////////////////////////////////
//信息输出
void out_Stack(Carparking_Stack *S)
{
int c;
c=S->top;
printf("场中有%d辆车,信息如下:\n",c+1);
while (c>=0)
{
printf("车位号: %d \t车牌号: %d \t入场时间: %d \n",c,S->cars[c].num,S->cars[c].io_time);
c--;
}
}
void out_Queue(Carparking_Queue *Q)
{
int i,j;
i=Q->front+1;
j=Q->rear;
printf("便道中有%d辆车!!信息如下:\n",j-i+1);
while (i<=j)
{
printf("车牌号: %d \t进入便道时刻: %d\n",Q->cars[i].num,Q->cars[i].io_time);
i++;
}
}
//////////////////////////////////////////////////////////////////////////
//菜单
int selete_main_menu()
{
int j;
printf("\n============停车场管理模拟程序============\n");
printf(" 1 录入原始信息 \n");
printf(" 2 停车场维护 \n");
printf(" 3 停车场信息查看 \n");
printf(" 4 退出系统 \n");
printf("==========================================\n");
printf("请选择:");
scanf("%d",&j);
return j;
}
int selete_submenu_do()
{
int j;
printf("\n========维护子系统========\n");
printf(" 1 车辆入场停车 \n");
printf(" 2 车辆出场离开 \n");
printf(" 3 返回 \n");
printf(" ==========================\n");
printf("请选择:");
scanf("%d",&j);
return j;
}
int selete_submenu_look()
{
int j;
printf("\n======信息查看子系统=======\n");
printf(" 1 查看场内情况 \n");
printf(" 2 查看便道情况 \n");
printf(" 3 返回 \n");
printf(" ===========================\n");
printf("请选择:");
scanf("%d",&j);
return j;
}
//////////////////////////////////////////////////////////////////////////
void main()
{
Carparking_Stack *S;
Carparking_Queue *Q;
S=SetStack();Q=SetQueue();
while (1)
{
switch(selete_main_menu())
{
case 1:
S=input_stack(S);
break;
case 2:
switch(selete_submenu_do())
{
case 1:
S=car_in(S,Q);
break;
case 2:
S=car_out(S,Q);
break;
case 3:
break;
}
break;
case 3:
switch(selete_submenu_look())
{
case 1:
if (!StackEmpty(S))
out_Stack(S);
else
printf("场内尚未停任何车辆!!\n\n");
break;
case 2:
if (!QueueEmpty(Q))
out_Queue(Q);
else
printf("\n便道中尚无等候车辆!!\n\n");
break;
case 3:
break;
}
break;
case 4:
exit();
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -