📄 pms.cpp
字号:
#include<stdlib.h>
#include<iostream.h>
#define OK 1
#define OVERFLOW -2
typedef int status;
typedef struct
{
char type;//车的型号
int num;//车牌
int time;//进场时间
}Car;
typedef struct//存储车场停车信息的栈
{
Car *base;
Car *top;//栈顶指针
int stacksize;//当前一分配的储存空间,以元素为单位
}sqstack;
typedef struct QNode//队列链式储存结构
{
Car data;
struct QNode *next;
}QNode,*Queueptr;
typedef struct//存储便道停车信息的队列
{
Queueptr front;//队头指针
Queueptr rear;//队尾指针
}LinkQueue;
sqstack park,temp;//定义栈的全局变量
LinkQueue wait;//定义队列的全局变量
Car car_info;//定义类的全局变量
int n,i=1,j=1,m[6];//数组m[6]是储存车辆收费标准
status InitStack(sqstack &s)//建立一个空栈
{
s.base=(Car*)malloc(n* sizeof(Car));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=n;
return OK;
}
status DestroyStack(sqstack &s)//销毁栈s,s不再存在
{
free(s.base);
s.base=s.top=NULL;
s.stacksize=0;
return OK;
}
status Push(sqstack &s,Car e)//压栈
{
*s.top++=e;
return OK;
}
Car Pop(sqstack &s,Car &e)//出栈
{
if(s.top==s.base) cout<<"ERROR";
e=*--s.top;
return e;
}
status InitQueue(LinkQueue &Q)//构造队列Q
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
status DestroyQueue(LinkQueue &Q)//销毁队列Q
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}
status EnQueue(LinkQueue &Q,Car e)//插入元素入队列
{
Queueptr p;
Q.rear->data=e;
p=(Queueptr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Car DeQueue(LinkQueue &Q,Car &e)//删除元素出队列
{
if(Q.front==Q.rear) cout<<"ERROR1";
Queueptr p=Q.front;
e=p->data;
Q.front=p->next;
if(Q.rear==p->next) Q.rear=Q.front;
free(p);
return e;
}
void Print(int cost,int outtime,char itime)
{
cout<<" 收费标准: "<<cost<<" 元/小时 "<<endl;
cout<<"\t\t停车时间: "<<outtime-itime<<" 小时 收费金额: "<<cost*(outtime-itime)<<"元";
cout<<"\n*******************************************************************************"<<endl;
}//Print
int SearchPark(int num,int outtime)//在停车场中查找要离开车辆车号
{
int find=0,x=0;
InitStack(temp);//初始化栈temp
Car o,p;
while(find==0&&park.base!=park.top)//查找
{
o=Pop(park,p);//把车辆从栈park推出
x+=1;
if(o.num==num)//找到要离开的车辆
{
find=1;
i-=1;
cout<<"***********************************该车在车场内********************************"<<endl;
if(o.type=='p'||o.type=='P') {cout<<"\t\t车 型:客车";Print(m[0],outtime,o.time);}
else if(o.type=='t'||o.type=='T') {cout<<"\t\t车 型:卡车";Print(m[1],outtime,o.time);}
else {cout<<"\t\t车 型:小车";Print(m[2],outtime,o.time);}
if(x!=1) cout<<"\n\t *** 要为该车让路的车辆:";
else cout<<"\n\t *** 不必为该车让路,该车可直接从车场开走! ***";
}//end if
else Push(temp,o);//找不到时,把车辆压入栈temp
}
while(temp.top!=temp.base)//从新把车辆从栈temp压回到栈park
{
p=Pop(temp,o);
if(find==1&&x!=1) cout<<p.num<<"--> ";//输出车的让路情况
Push(park,p);
}
return (find);//找到就返回1,找不到就返回0
}//SearchPark
int SearchWait(int num,int outtime)//在便道中查找要离开车辆车号
{
int find=0,k=j;
Car c,e;
while(find==0&&k!=1)
{
c=DeQueue(wait,e);//车辆出队列wait
k--;
if(c.num==num)//找到要离开的车辆
{
find=1;
cout<<"***********************************该车在便道内********************************"<<endl;
if(c.type=='p'||c.type=='P') {cout<<"\t\t车 型:客车";Print(m[3],outtime,c.time);}
else if(c.type=='t'||c.type=='T') {cout<<"\t\t车 型:卡车";Print(m[4],outtime,c.time);}
else {cout<<"\t\t车 型:小车";Print(m[5],outtime,c.time);}
}
else EnQueue(wait,c);//不离开的车辆从新入队列wait
}
return (find);//找到就返回1,找不到就返回0
}//SearchWait
void OutCar()
{
int outtime,num;
Car l;
cout<<" *** 请输入该车的车牌:";
cin>>num;
do
{
cout<<" *** 请输入该车出车场的时间:";
cin>>outtime;
if(outtime<=car_info.time) cout<<"\n\t\t\t *** 时间必须递增!请重新输入! ***"<<endl;
}while(outtime<=car_info.time);
cout<<endl;
if(SearchPark(num,outtime)!=0)//在停车场内开始找
{
if(wait.front!=wait.rear)//便道上的车辆数目不为零
{
Push(park,DeQueue(wait,l));
cout<<"\n\n\t *** 请便道内车牌为 "<<l.num<<" 的车进车场,停在停车场的第"<<i<<"号车位! ***"<<endl;
j--;
i++;
}//end if
else cout<<"\n\n\t *** 便道上没有车进入车场! ***"<<endl;
}//end if
else if(SearchWait(num,outtime)!=0) ;
else cout<<"\n\t *** 该车不在停车场和便道内! ***"<<endl;
}//OutCar
void InCar()
{
char h;
int num;
int time;
do
{
cout<<"\n\t\t\t ******************************\n";
cout<<" \t\t\t * 该 车 类 型 *\n";
cout<<" \t\t\t ******************************\n";
cout<<" \t\t\t * P-->客车 *\n";
cout<<" \t\t\t * T-->卡车 *\n";
cout<<" \t\t\t * C-->小车 *\n";
cout<<" \t\t\t ******************************\n";
cout<<"\t\t\t\t请输入(P,T,C):";
cin>>h;
if(h!='p'&&h!='P'&&h!='t'&&h!='T'&&h!='c'&&h!='C') cout<<"\n\n\t\t\t *** 输入错误!请重新输入! ***"<<endl;
}while(h!='p'&&h!='P'&&h!='t'&&h!='T'&&h!='c'&&h!='C');
car_info.type=h;
cout<<"\n *** 请输入该车的车牌:";
cin>>num;
car_info.num=num;
do
{
cout<<" *** 请输入该车进车场时间:";
cin>>time;
if(time<=car_info.time) cout<<"\n\t\t\t *** 时间必须递增!请重新输入! ***"<<endl;
else {car_info.time=time;break;}
}while(time<=car_info.time);
if(park.top-park.base<park.stacksize)//把车压入停车场
{
Push(park,car_info);
cout<<"\n *** 该车停在停车场的第 "<< i<<" 号车位! ***"<<endl;
i++;
}
else//当停车场满时,把车停在便道上
{
EnQueue(wait,car_info);
cout<<"\n *** 该车停在便道上! ***"<<endl;
j++;
}
}//InCar
void Exit()
{
DestroyStack(park);//销毁栈park
DestroyStack(temp);//销毁栈temp
DestroyQueue(wait);//销毁队列wait
cout<<"\n\t\t\t *** 欢迎使用停车场管理系统! ***"<<endl;
}//Exit
void main()
{
char c;
car_info.time=0;
cout<<"\n\t\t\t *** 停 车 场 管 理 系 统 ***"<<endl<<endl;
cout<<" *** 请输入停车场内总车位数:";
cin>>n;
InitStack(park);//初始化栈park
InitQueue(wait);//初始化队列wait
cout<<"\n *** 请输入客车在停车场内的收费标准(元/小时):";
cin>>m[0];
cout<<" *** 请输入卡车在停车场内的收费标准(元/小时):";
cin>>m[1];
cout<<" *** 请输入小车在停车场内的收费标准(元/小时):";
cin>>m[2];
cout<<"\n *** 请输入客车在便道内的收费标准(元/小时):";
cin>>m[3];
cout<<" *** 请输入卡车在便道内的收费标准(元/小时):";
cin>>m[4];
cout<<" *** 请输入小车在便道内的收费标准(元/小时):";
cin>>m[5];
do
{
cout<<"\n\t\t\t ******************************\n";
cout<<" \t\t\t * 主 菜 单 *\n";
cout<<" \t\t\t ******************************\n";
cout<<" \t\t\t * A-->车辆进站 *\n";
cout<<" \t\t\t * D-->车辆出站 *\n";
cout<<" \t\t\t * E-->退出系统 *\n";
cout<<" \t\t\t ******************************\n";
cout<<"\t\t\t\t请输入(A,D,E):";
cin>>c;
switch(c)
{
case 'A':
case 'a':InCar();break;
case 'D':
case 'd':OutCar();break;
case 'E':
case 'e':Exit();break;
default:cout<<"\n\n\t\t\t *** 输入错误!请重新输入! ***"<<endl;
}
if(c=='E'||c=='e') break;
}while(c!='E'||c!='e');
}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -