【皮皮蕾】数据结构讨论课二:栈和队列的应用——停车场模拟

栈和队列的应用——停车场模拟

内容要点

以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间(单位是小时)和应交纳的费用(在便道上停留的时间不收费),假设停车费为每小时m元。等候在便道上的汽车可以直接从便道上开走,但此时排在它前面的汽车要先开走让路,然后再依次排到队尾。栈和队列均采用链表结构实现。

源码

#include<iostream>
using namespace std;
int e=0;//假定停车场内只有3个车位
class node
{
    
    
public:
	int number;
	int intime;
	int v;
	node *next;
};
class stack
{
    
    
public:
	node *top;
	stack(){
    
    top=NULL;}
	~stack(){
    
    }
	void push(int x)//入栈
	{
    
    
		node *s=new node;
		s->number=x;
		s->next=top;
		top=s;
		if(e<3)//停车场内只有3车位
		{
    
    
			e++;
			cout<<"请输入入场时间:";cin>>s->intime;
		}
	}
	int find(int num)//寻找车牌为num的车辆//定义栈顶top指向停车场内第一辆车
	{
    
    
		node *p=top;
		int i=0;
		while(i<3&&p->number!=num)
		{
    
    
				i++;
				p=p->next;
		}
		if(i==3)
		{
    
    
			return 0;//说明没找到车牌相同的车
		}
		else
		{
    
    
			return i+1;
		}
	}
	void vei(int num,int r)//赋值车辆在停车场内的位置
	{
    
    
		node *p=top;
		int i=0;
		while(i<3)
		{
    
    
			if(p->number==num)
			{
    
    p->v=r;break;}
			else
			{
    
    
				i++;
				p=p->next;
			}
		}
	}
	int vv(int num)//返回车牌为num的在停车场的位置
	{
    
    
		node *p=top;
		int i=0;
		while(i<3)
		{
    
    
			if(p->number==num)
				return p->v;
			else
			{
    
    
				i++;
				p=p->next;
			}
		}
		return 0;
	}
	int time(int num)//返回车牌为num的intime
	{
    
    
		node *p=top;
		int i=0;
		while(i<3)
		{
    
    
			if(p->number==num)
				return p->intime;
			else
			{
    
    
				i++;
				p=p->next;
			}
		}
		return 0;
	}
	void pop(int num)//出栈
	{
    
    
		if(e<=0)
			return ;
		node *p;
		if(top->number==num)
		{
    
    
			e--;
			p=top;
			top=top->next;
			delete p;
			return;
		}
		else if(top->next->number==num)
		{
    
    
			e--;
			p=top->next;
			top->next=p->next;
			top->v=e;
			delete p;
			return;
		}
		else if(top->next->next->number==num)
		{
    
    
			e--;
			p=top->next->next;
			top->v=e;
			top->next->v=e-1;
			delete p;
			return;
		}
	}
};
int ee=0;//便道车辆总数
class node1
{
    
    
public:
	int number;
	int v;//在队列中的位置
	node1 *next;
};
class link
{
    
    
public:
	node1 *front,*rear;
	link()
	{
    
    
		node1 *s=new node1; s->next=NULL;front=rear=s;
	}//构造函数
	~link(){
    
    }
	void enqueue(int num)//将车牌号为num的入队
	{
    
    
		ee++;
		node1 *s=new node1;
		s->number=num;
		s->next=NULL;
		rear->next=s;
		rear=s;
		s->v=ee;
	}
	int vei(int num)
	{
    
    
		node1 *s=front;
		int k=1;
		if(rear->number==num)
		{
    
    
			return rear->v;
		}
		while(s!=rear)
		{
    
    
			if(s->number==num)
			{
    
    k=0;break;}
			else
			{
    
    s=s->next;}
		}
		if(k==0)//返回在便道的位置
			return s->v;
		else
			return 0;
		//在便道不存在
	}
	int dequeue()//队列中第一个元素出队
	{
    
    
		ee--;
		if(front==rear)cout<<"下溢"<<endl;
		node1 *p;
		p=front->next;
		int x=p->number;
		front->next=p->next;
		if(p->next==NULL)//判断出队前队列长度是否为1
			rear=front;
		delete p;
		return x;
	}
	/*void out(int num)//队列中num的元素出队
	{
		node1 *s=front;
		if(s->number==num)
		{
			dequeue();
			return;
		}
		e--;
		while(s!=rear)
		{
			if(s->next->number==num)
			{
				node1 *p=s->next;
				s->next=p->next;
				delete p;//出队
				return;
			}
			else
			{
				s=s->next;
			}
		}
		if(rear->number==num)
		{
			node1 *q=front;
			while(q->next!=rear)
			{
				q=q->next;
			}
			q->next=NULL;
			delete rear;
			rear=q;
		}
	}*/
};
int n;stack m;int num;link mm;
void mean1()//停车
{
    
    
	cout<<"请输入车牌号:";cin>>num;
			if(e<3)//可以进入停车场
			{
    
    
				m.push(num);//入栈
				int d=m.find(num);
				{
    
    
					cout<<"车牌号为"<<num<<"的车辆在停车场的第"<<e<<"位。"<<endl;
				    m.vei(num,e);
				}
			}
			else//存入便道
			{
    
    
				cout<<"当前停车场已满,将为您转入便道"<<endl;
				mm.enqueue(num);//入队列
				cout<<"车牌号为"<<num<<"的车辆在便道的第"<<ee<<"位。"<<endl;
			}
}
void mean2()//取车
{
    
    
	int num;
			cout<<"请输入要取走车辆的车牌号:";cin>>num;
			//判断是否停车场///
			if(m.find(num))//停车场内存在
			{
    
    
				cout<<"车牌号为"<<num<<"的用户,请输入您的离开时间(小时)";int outtime;cin>>outtime;
				cout<<endl<<"您本次的停车场使用时间为"<<outtime-m.time(num)<<"小时,产生费用为"<<outtime-m.time(num)<<"*m元。"<<endl<<endl;
				m.pop(num);//出栈
				if(ee>0)//若便道中存在车辆
				{
    
    
				int nu=mm.dequeue();//出队列,入栈
				cout<<"车牌号为"<<nu<<"的用户您好!现将您的车辆驶入停车场"<<endl;
				m.push(nu);
				}
			}
			else if(mm.vei(num))//便道内存在
			{
    
    
				cout<<"您未使用停车场,欢迎下次使用bye~"<<endl;
				int t=mm.vei(num)-1;
				if(t==0)
					mm.dequeue();
				else
				{
    
    
				    while(t)
				    {
    
    
					ee--;
					int a=mm.dequeue();//出栈前面的元素
					mm.enqueue(a);
					ee++;
					t--;
				    }
					mm.dequeue();
				}
			}
			else if(m.find(num)==0&&mm.vei(num)==0)//都不存在
			{
    
    cout<<"该车辆既不在停车场也不在便道"<<endl;}
}
void mean3()//查找车辆
{
    
    
	cout<<"请输入要查找的车牌号:";cin>>num;
			int d=m.find(num);
			if(m.vv(num))//停车场位置
			{
    
    
				cout<<"车牌号为"<<num<<"的车辆在停车场的第"<<m.vv(num)<<"位"<<endl;
			}
			else if(mm.vei(num))//便道位置
			{
    
    
				cout<<"车牌号为"<<num<<"的车辆在便道的第"<<mm.vei(num)<<"位"<<endl;
			}
			else if(m.find(num)==0&&mm.vei(num)==0)//不存在该车辆
			{
    
    
				cout<<"不存在该车辆"<<endl;
			}
}
int main()//主菜单
{
    
    
	cout<<"功能选择:"<<endl;
	cout<<"1.停车(显示停车位置)    2.取车(显示在停车场内时间和费用)    3.查找车辆     0.退出系统"<<endl;
	while(cin>>n&&n)
	{
    
    
		switch(n)
		{
    
    
		case 1:mean1();
		/*	cout<<"请输入车牌号:";cin>>num;
			if(e<3)//可以进入停车场
			{
				m.push(num);//入栈
				int d=m.find(num);
				{
					cout<<"车牌号为"<<num<<"的车辆在停车场的第"<<e<<"位。"<<endl;
				    m.vei(num,e);
				}
			}
			else//存入便道
			{
				cout<<"当前停车场已满,将为您转入便道"<<endl;
				mm.enqueue(num);//入队列
				cout<<"车牌号为"<<num<<"的车辆在便道的第"<<ee<<"位。"<<endl;
			}*/
			break;
		case 2:mean2();
			/* int num;
			cout<<"请输入要取走车辆的车牌号:";cin>>num;
			//判断是否停车场///
			if(m.find(num))//停车场内存在
			{
				cout<<"车牌号为"<<num<<"的用户,请输入您的离开时间(小时)";int outtime;cin>>outtime;
				cout<<endl<<"您本次的停车场使用时间为"<<outtime-m.time(num)<<"小时,产生费用为"<<outtime-m.time(num)<<"*m元。"<<endl<<endl;
				m.pop(num);//出栈
				if(ee>0)//若便道中存在车辆
				{
				int nu=mm.dequeue();//出队列,入栈
				cout<<"车牌号为"<<nu<<"的用户您好!现将您的车辆驶入停车场"<<endl;
				m.push(nu);
				}
			}
			else if(mm.vei(num))//便道内存在
			{
				cout<<"您未使用停车场,欢迎下次使用bye~"<<endl;
				int t=mm.vei(num)-1;
				if(t==0)
					mm.dequeue();
				else
				{
				    while(t)
				    {
					ee--;
					int a=mm.dequeue();//出栈前面的元素
					mm.enqueue(a);
					ee++;
					t--;
				    }
					mm.dequeue();
				}
			}
			else if(m.find(num)==0&&mm.vei(num)==0)//都不存在
			{cout<<"该车辆既不在停车场也不在便道"<<endl;}*/
			break;
		case 3:mean3();/*
			cout<<"请输入要查找的车牌号:";cin>>num;
			int d=m.find(num);
			if(m.vv(num))//停车场位置
			{
				cout<<"车牌号为"<<num<<"的车辆在停车场的第"<<m.vv(num)<<"位"<<endl;
			}
			else if(mm.vei(num))//便道位置
			{
				cout<<"车牌号为"<<num<<"的车辆在便道的第"<<mm.vei(num)<<"位"<<endl;
			}
			else if(m.find(num)==0&&mm.vei(num)==0)//不存在该车辆
			{
				cout<<"不存在该车辆"<<endl;
			}*/
			break;
		}
	}
}
//皮皮蕾原创,点个赞叭!

创新思维

在讨论课上提出过新的idea,例如将停车场和便道通过循环队列的形式实现,大概左右两边都是循环队列中间是一条过道 这个样子。

求点赞!求关注!一键三连!!!

猜你喜欢

转载自blog.csdn.net/qq_43704702/article/details/103745851