栈和队列的应用——停车场模拟
内容要点
以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间(单位是小时)和应交纳的费用(在便道上停留的时间不收费),假设停车费为每小时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;
}
}
}
//皮皮蕾原创,点个赞叭!
求点赞!求关注!一键三连!!!
来源:CSDN
作者:纸梯先生
链接:https://blog.csdn.net/qq_43704702/article/details/103745851