#include <iostream>
#include <string>
using namespace std;
const int MAX_STOP=4;  //定义停车场最大停车数
const int MAX_PLATE=10;  //定义车牌号最大长度
//数据结构定义
//定义存储汽车信息的结构体
typedef struct
{
    char license_plate[MAX_PLATE];//汽车牌照号码,定义为一个字符指针类型
    char state;    //汽车当前状态,字符p表示停放在停车位上,字符s表示停放在便道上,每辆车的初始状态用字符i来进行表示
}CAR;
//定义模拟停车场的栈结构
typedef struct
{
    CAR STOP[MAX_STOP]; //汽车信息的存储空间
    int top;    //用来指示栈顶位置的静态指针
}SeqStack;
//定义模拟便道的队列结构
typedef struct node
{
    CAR WAIT;    //汽车信息的存储空问
    struct node *next;    //用来指示队列位置的动态指针
}QNode;  //链队列节点的类型
//定义链队列的收尾指针
typedef struct
{
    QNode *front,*rear;
}LQueue;  //将头尾指针封装在一起的链队
//函数声明
int Empty_LQueue(LQueue *q);    //判队空
int LeaveCheck(SeqStack parking,char *license_plate); //检查离开的车是否在停车场中
int QueueLength(LQueue *q);    //判队长度
int Out_LQueue(LQueue *&sidewalk,char *license_plate);  //出队操作
int StackEmpty(SeqStack parking);    //判断栈是否为空
int StackFull(SeqStack parking);    //判断栈是否为满
int StackPop(SeqStack &parking);    //出栈操作
int StackTop(SeqStack parking, char *license_plate); //取栈项元素
void Car_come(SeqStack &parking,LQueue *&sidewalk);  //有车到来时的操作
void Car_leave(SeqStack &parking,LQueue *&sidewalk);  //有车离开的操作
void Display(SeqStack parking);    //显示停车场内的所有信息调试时用
void InitStack(SeqStack &parking);    //初始化栈
汽车牌照选号
void InitList(LQueue *&sidewalk);    //初始化队列
void In_LQueue(LQueue *&sidewalk, char *license_plate); //进队操作
void Input_Check(char *license_plate);    ////检验输入的车牌是否合法
void StackPush(SeqStack &parking,char *license_plate); //进栈操作
void main()
{
    //定义变量
    SeqStack parking;
    LQueue *sidewalk= NULL;
    char *choice= new char;
    int flag=1; //定义一个变量判断是否退出
    //初始化一个为空的停乍场
    InitStack(parking);
    //初始化一个为空的便道
    InitList(sidewalk);
    //运行界面及功能选择
    while(flag)
    {
        cout<<"      停车场模拟管理系统      "<<endl;
        cout<<"**************************************************"<<endl;
        cout<<"\t有车到来时请按[C]键"<<endl<<endl;
        cout<<"\t有车要走时请按[l]键"<<endl<<endl;
        cout<<"\t查看停车场请按[D]键"<<endl<<endl;
        cout<<"\t要退出系统请按[Q]键"<<endl<<endl;
        cout<<"**************************************************"<<endl;
        cout<<"请选择操作:";
        gets(choice);
        if(1!=strlen(choice))
        {
            cout<<"请正确输入选项!";
            continue;
        }
        else
        {
            switch(*choice)
            {
            case 'c':
            case 'C':
                {
                    Car_come(parking,sidewalk);
                    break;
                }
            case'l' :
            case'L':
                {
                Car_leave (parking,sidewalk);
                break;
                }
            case'q':
            case 'Q':
                {
                    flag=0;
                    break;
                }
            case 'd':
            case 'D':
                {
                    Display(parking);break;
                }
            default:
                cout<<"选择不正确!请重新选择"<<endl;
            }
        }
    }
}
//有车到来时的操作
void Car_come(SeqStack &parking, LQueue *&sidewalk)
{
//定义变量
    char license_plate[MAX_PLATE];
    cout<<"请输入车辆的车牌号码:";
    Input_Check(license_plate);
    //判断停车场是否已满,满则进入便道,不满进入停车场
    if(StackFull(parking))
    {
        In_LQueue(sidewalk,license_plate);    //进入便道
        cout<<"停车场已满清在便道等候,您的位置为"<<QueueLength(sidewalk)<<endl;
    }
    else
    {
        StackPush(parking,license_plate);    //进入停车场
        cout<<"请进入停车场中的"<&p+1<<"号停车位"<<endl;
    }
}
    //有车离开时的操作
void Car_leave(SeqStack &parking, LQueue *&sidewalk)
{
//定义变量
    SeqStack tmpparking;    //定义临时停车场
    char leave_license_plate[MAX_PLATE];//要离开的车牌号
    char license_plate[MAX_PLATE];  //存放从停车场中读出来的车牌信息
    InitStack(tmpparking);    //初始化临时停车场
    //判断停车场中是否有车
    if(StackEmpty(parking))
    {
        cout<<"当前停车场中没有车"<<endl;
        return;    //退出子函数
    }
        cout<<"请输入要离开的车牌照:";
        Input_Check(leave_license_plate);
        cout<<"当前停车场中有"<&p+1<<"辆车"<<endl;
        if(LeaveCheck(parking,leave_license_plate))//判断车是否在停车场中
        {
            //车在停车场中
            cout<<"您的车在 "<<LeaveCheck(parking,leave_license_plate)<<"号车位上"<<endl;
            while(StackTop(parking,license_plate)&& (strcmp(parking.p].license_plate, leave_license_plate)!=0))
            {
                strcpy(parking.p].license_plate, license_plate);
                cout<<"牌照为"<<license_plate<<"的车暂时退出停车场"<&p+1<<"号位"
<<endl;
                StackPush(tmpparking,license_plate); //停车场中的车暂时退出进入临时停车场
                StackPop(parking);  //出栈
            }
            cout<<"牌照为"<<license_plate<<"的车离开停车场"<&p+1<<"号位"<<endl;
            StackPop(parking);  //出栈
            //将临时停车场巾的车停回停车场
            while(StackEmpty(tmpparking)!=1)
            {
                StackTop(tmpparking, license_plate);
                StackPush(parking, license_plate);
                cout<<"牌照为"<<license_plate<<"的车进入停车场"<&p+1<<"号位"<<endl;
                license_plate[0]='\0';
                StackPop(tmpparking);
                p+1==MAX_STOP-1)//判断车离开前停车场是否停满
                    if(QueueLength(sidewalk))//如果停满则判断便道上是否有车
                    {
                        //便道中有车则从便道中停入停车场
                        Out_LQueue(sidewalk, license_plate);    //出队
                        StackPush(parking, license_plate);//入栈
                        cout<<"在便道中牌照为"<<license_plate<<"的车进入停车场"<&p+1<<"号"<<endl;
                    }
                    else//车不在停车场中
                        cout<<"您的车不在停车场中!"<<endl;