使用栈和队列实现的狭长停车场管理
1、情况说明:
(1)停车场结构为一条狭长的通道(可视为栈)。
(2)若停车场内车辆已经停满,后来的车需要在路边排队等待,库内有车出来才能入库 (可视为队列)。
(3)使用A代表入库,D代表出库,车辆信息包括入库时间和车牌。
2、数据定义
#define M 3//车库能停几辆车,在这里定义
//-----------------///--------------------///--------------------//
typedef struct {
int num;
int ID;
int arrivetime;
}carinformation;
//定义停车场的结构体
typedef struct parkinglot {
carinformation stack[M];
int top;
}carpark;//定义栈结构
//-----------------///--------------------///--------------------//
//--------------------///--------------------///--------------------//
typedef struct carnode {
int num;
int ID;
int arrivetime;
//struct node *next;
}qptr;
//定义外面狭长路的队列
typedef struct {
qptr *front, *rear;
}carqueue;
//--------------------///--------------------///--------------------//
3、初始化栈和队列函数
carpark *initstack()
{
carpark *T;
T = (carpark *)malloc(sizeof(carpark));
if (T == NULL)
{
/*地址分配错误直接退出程序,不能继续了*/
system("cls");
printf("\n\n\t因为内存空间问题,导致程序出错!即将退出!\n\n");
system("pause");
exit(0);
}
T->top = -1;
return T;
}
//初始化停车场
carqueue *initqueue()
{
carqueue *L;
L = (carqueue *)malloc(sizeof(carqueue));
L->front = (carqueue *)malloc(sizeof(carqueue));
if (L == NULL||L->front == NULL)
{
/*地址分配错误直接退出程序,不能继续了*/
system("cls");
printf("\n\n\t因为内存空间问题,导致程序出错!即将退出!\n\n");
system("pause");
exit(0);
}
if (L->front == NULL);
L->front->next = NULL;
L->rear = L->front;
return L;
}
//初始化路边停车位
4、算法实现
先上代码后解释:
/*
下面是整个程序的核心内容
主要实现了进入车库和路边等待的调用
两个表的地址需要传过来
车库表和路边队列表;
carinter(char _array, int num, int time,carpark *P,carqueue *L)
carinter(进库还是出库char A/D ,车牌号int , 到达时间int ,carpark *P 车库表 ,carqueue *L 路边表)
*/
int carinter(char _array, int num, int time,carpark *P,carqueue *L)
{
if (_array == 'A')
{
if (parkfull(P) == 1)
{
int temp;
//这里写车库满后进入队列的code
printf("\t车牌为:%d的车辆,已进入路边等待!\n\n",num);
temp = carroadsaid(time, num, L);
if (temp == 0)
{
/*地址分配错误直接退出程序,不能继续了*/
system("cls");
printf("\n\n\t因为内存空间问题,导致程序出错!即将退出!\n\n");
system("pause");
exit(0);
}
return 1;
}
else
{
int _top;
printf("\t车牌为:%d的车辆,已进入车库!\n\n",num);
_top = ++P->top;
P->stack[_top].arrivetime = time;
P->stack[_top].ID = num;
P->stack[_top].num = internum++;
return 1;
}
}
else if (_array == 'D')
{
//这里是出库code
outparking(num, time, P, L);
return 2;//返回2,不清楚是否成功,只是返回一个数,错误在函数内判断
}
else//读取的char是个非法值,所以返回错误
{
return 0;
}
}
解释:
(1)函数调用方法为:
carinter(char _array, int num, int time,carpark *P,carqueue *L)
第一个参数char _array为车辆是进入还是出去,第二个参数num是车牌号,第三个time是到达/离去时间(假设为int),后面两个参数为栈表和队列表的地址。
(2)首先判断_array是 A 入库还是 D 出库。如果为入库,就再接一个IF判断函数用于判出库是否已满(栈是否满),车满判断函数如下:
int parkfull(carpark *P)
{
if (P->top == M - 1)
return 1;
else
return 0;
}
//车满判断
如果车位没有满,就执行上面入库核心代码else里面的函数直接执行入栈操作。ps:车满是if内的,未满写在了else里面。
(3)对于库满的操作:
调用入队操作函数,carroadsaid(),参数明白撒~
/*
路边等待队列分配
carroadsaid(int time, int ID, carqueue *L)
carroadsaid(时间, 车牌, carqueue *L 队列表)