/**
* 实验题目:
* 停车场管理程序
* 实验目的:
* 深入掌握栈和队列应用的算法设计
* 实验内容:
* 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
* 汽车在停车场内按车辆到达时间的先后顺序,依次由南向北排列(大门在最北端,最
* 先到达的第一辆车停放在车场的最南端),若车场内已停满n辆车,则后来的汽车只能
* 在门外的便道即候车场上等候,一旦有车开走,则排在便道上的第一辆车即可开入;
* 当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车
* 开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时
* 必须按它停留的时间长短交纳费用。
* 用栈模拟停车场,用队列模拟车场外的便道,按照从键盘获候车场中的车辆:104取的数据序列进行模拟管理。
* 每一组输入数据包括3个数据项:汽车到达(1)或者离开(2)、汽车牌照号码以及到达或者
* 离开的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车
* 在停车场内或便道上的停车位置;若是车辆离开,则输出汽车在停车场内停留的时间和
* 应交纳的费用(在便道上停留的时间不收费)。注意:栈采用顺序存储结构,队列采用环形
* 队列。
* 还需设一个临时栈,用于临时停放为要给离开的汽车让路而从停车场退出来的汽车,
* 也用顺序结构实现。
* 用户输入的命令有以下5种:
* 1、汽车到达
* 2、汽车离开
* 3、输出停车场中的所有汽车牌号
* 4、输出候车场中的所有汽车牌号
* 5、退出系统
*/
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#define N 3 // 停车场内最多的停车数
#define M 4 // 候车场内最多的停车数入队
#define PRICE 2 // 每单位停车费用
/*---------------------停车场:栈采用顺序存储结构--------------------*/
typedef struct
{
int car_no[N]; // 车牌号
int car_time[N]; // 进场时间
int top; // 栈顶指针
}SqStack; // 声明顺序栈类型
/*------------------------候车场:队列采用环形队列-------------------*/
typedef struct
{
int car_no[M]; // 车牌号
int que_front; // 队头指针
int que_rear; // 队尾指针
}SqQueue; // 声明环形队列类型
/*------------------------栈的运算算法-------------------*/
/*------------------------初始化栈-------------------*/
static void init_stack(SqStack *&s) // 指针的引用
{
s = (SqStack *)malloc(sizeof(SqStack)); // 动态分配存储空间
s->top = -1;
}
/*------------------------判断栈空-------------------*/
static bool stack_empty(SqStack *s)
{
return (s->top == -1);
}
/*------------------------判断栈满-------------------*/
static bool stack_full(SqStack *s)
{
return (s->top == N - 1);
}
/*------------------------压栈-------------------*/
static bool push(SqStack *&s, int car_no, int car_time)
{
&n