⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pms.cpp

📁 利用栈和队列完成停车场的管理,数据结构的实习题目,并完成选做内容
💻 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 + -