#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define OVERFLOW -2
#define SIZE 5//停车场位置数,这里设置小点方便数据输入
typedef int Status;
//停在停车场中的车(通过顺序栈实现)
typedef struct Car1
{
int number;//车号
int arr_time;//抵达时间
}CarNode;
//停车位结点(栈)
typedef struct
{
CarNode* base;//堆栈底
CarNode* top;//堆栈顶
int stacksize;
}Park;
//停在临时通道内的车(通过单链表实现)
typedef struct Car2
{
int number;//车号
int arr_time;//到达时间
struct Car2* next;
}*CarPtr, CarNode2;
//临时通道
typedef struct
{
CarPtr front;//队列的队头
CarPtr rear;//队列的队尾
int length;
}Shortcut;
//初始化停车场
Status InitStack(Park& P)
{
P.base = (CarNode*)malloc(SIZE * sizeof(Car1));
if (!P.base)
exit(OVERFLOW);
P.top = P.base;
P.stacksize = 0;
return OK;
}
//车进入停车场
Status Push(Park& P, CarNode e)
{
*P.top++ = e;
++P.stacksize;
return OK;
}
//车离开停车场
Status Pop(Park& P, CarNode& e)
{
if (P.top == P.base)
printf("停车场为空");
else
{
e = *--P.top;
--P.stacksize;
}
return OK;
}
//初始化临时通道
Status InitQueue(Shortcut& S)
{
S.front = S.rear = (CarPtr)malloc(sizeof(Car2));
if (!S.front || !S.rear)
exit(OVERFLOW);
S.front->next = NULL;
S.length = 0;
return OK;
}
//车子进入临时通道
Status EnQueue(Shortcut& S, int number, int arr_time)
{
CarPtr p;
p = (CarPtr)malloc(sizeof(Car2));
if (!p)
exit(OVERFLOW);
p->number = number;
p->arr_time = arr_time;
p->next = NULL;
S.rear->next = p;
S.rear = p;
++S.length;
return OK;
}
//车子离开临时通道,进入停车场
Status DeQueue(Shortcut& S, CarPtr& w)
{
if (S.length == 0)
printf("通道为空");
else
{
w = S.front->next;
S.front->next = w->next;
--S.length;
}
return OK;
}
//对进栈车辆的处理
Status Arrival(Park& P, Shortcut& S)
{
int number, arr_time;
printf("请输入车牌号:");
scanf_s("%d", &number);
printf("请输入进停车场的时间(例1645):");
scanf_s("%d", &arr_time);
if (P.stacksize < SIZE)
{
CarNode c;
c.number = number;
c.arr_time = arr_time;
Push(P, c);
printf("该车停在第%d号位置\n", P.stacksize);
}
else
{
EnQueue(S, number, arr_time);
printf("停车场已满,暂时停在便道的第%d个位置。\n", S.length);
}
return OK;
}
//停车场的车离栈,临时通道内的车进入停车场
Status Leave(Park& P, Park& P1, Shortcut& S)
{
int number, le_time, flag = 1, arr_time;
printf("请输入离开车辆车牌号:");
scanf_s("%d", &number);
printf("请输入离开时间(例1645):");
scanf_s("%d", &le_time);
CarNode e, m;
CarPtr w;
while (P.stacksize)
{
Pop(P, e);//车辆离开
if (e.number == number)
{
flag = 0;
arr_time = e.arr_time;
break;
}
//临时做个栈,然后将让道的车辆信息暂时存储在这个临时栈内
Push(P1, e);
}
//将临时栈内的信息插入停车场
while (P1.stacksize)
{
Pop(P1, e);
Push(P, e);
}
if (flag == 0)
{
if (S.length != 0)
{
DeQueue(S, w);
m.arr_time = le_time;//新进入的车的时间等于离开车的时间
m.number = w->number;
Push(P, m);
free(w);
printf("车牌号为%d的车已经由便道进入停车场\n", m.number);
}
}
else
{
printf("停车场不存在车辆为%d的车", number);
}
return OK;
}
//展示停车场车辆的车牌号
Status DisplayStack(Park p)
{
printf("停车场停车信息如下(先进的车辆在最右端):\n");
if (p.base == NULL)
return OVERFLOW;
if (p.top == p.base)
printf("停车场中没有车");
CarNode* q;
q = p.top;
while (q > p.base)
{
q--;
printf("%d ", q->number);
}
printf("\n");
return OK;
}
//展示临时车道的车牌号
Status DisplayQueue(Shortcut s)
{
printf("便道停车信息如下(先进的车辆在最右端):\n");
if (s.front == s.rear)
printf("便道内没车");
CarPtr p;
p = s.front->next;
while (p)
{
printf("%d ", p->number);
p = p->next;
}
printf("\n");
return OK;
}
int main()
{
int m = 1;
char flag; //选项
Park P, Q;
Shortcut S;
InitStack(P);
InitStack(Q);
InitQueue(S);
while (m)
{
printf(" ---------- \n");
printf("|1 到达车辆|\n");
printf("|2 列表信息|\n");
printf("|3 离开车辆|\n");
printf("|4 退出程序|\n");
printf(" ---------- \n");
printf("请输入(1,2,3,4): ");
scanf_s("%c", &flag);
switch (flag)
{
case '1':
Arrival(P, S); break; //车进入停车场
case '2':
DisplayStack(P);
DisplayQueue(S);
break;
case '3':
Leave(P, Q, S); break; //车离开停车场
case '4':
m = 0;
break;
default:
printf("Input error!\n");
break;
}
while (flag != '\n')
scanf_s("%c", &flag);
}
return 0;
}
大佬帮我看看对不对,还能不能简化一下
车牌号只能输入数字,怎么改成能输入