#include <iostream>
#include <string>
using namespace std;
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;
发布评论