📄 停车场管理.cpp
字号:
#include<iostream.h>
#include<assert.h>
//定义一个汽车类,因为下面的栈和队列的数据成员都是一个汽车的对象
class car
{
public:
//把t、num定义为公有,是因为在main()中要调用对象的num来进行比较,并且,当车在停车场外时,既非还要修改s的值。
char t;
int num;
int s;
car()
{t=0;num=0;s=0;}
//重载=,以免下面赋值的时候出现错误。
car operator=(car&c)
{
t=c.t;
num=c.num;
s=c.s;
return *this;
}
void set()
{
//自行输入车的信息。
cout<<"停留状况是:'A'表示到达,'D'表示离去,'E'表示输入结束,请输入A/D/E:";
cin>>t;
while(t!='A'&&t!='D'&&t!='E')
{
cout<<"输入错误,请重新输入:"<<endl;
cin>>t;
}
cout<<"车牌号是:";
cin>>num;
if(t=='A')
{
cout<<"到站时间:";
cin>>s;
}
if(t=='D')
{
cout<<"离站时间:";
cin>>s;
}
}
};
template<class T>
//定义栈,作为停车场用,还可以作为临时存放停车场中倒出的元素。
class stack
{//顺序栈。
private:int maxsize;
public:
T *ElmList;
int top;
stack(int x)
{
top=-1;
maxsize=x;
ElmList=new T[maxsize];
}
bool full()
{return top==maxsize-1;}
bool empty()
{return top==-1;}
void push(T a)
{
if(top==maxsize-1)
{
cout<<"车站已被停满"<<endl;
}
else
{
top++;
ElmList[top]=a;
}
}
T pop()
{
assert(top!=-1);
return ElmList[top--];//先返回,后top--;
}
};
template<class T>
//链表队列,作为停车场外的车道。
class ListNode
{
public:
T data;
ListNode *link;
};
template<class T>
class queue
{
public:
ListNode <T>*front;
ListNode <T>*rear;
int curr_len;
queue()
{
front=rear=NULL;
curr_len=0;
}
bool empty()
{return front==NULL;}//注意,这儿不能写为front==rear,因为只有一个结点时,同样也是front==rear;
void Enqueue(T a)
{
ListNode<T> *p=new ListNode<T>;
p->data=a;
if(rear)
{
rear->link=p;
p->link=NULL;
rear=p;
}
else
{
front=rear=p;
}
curr_len++;
}
T Dequeue()
{
assert(front!=NULL);
ListNode <T>*p=front;
if(curr_len !=1)//把它写成front->link!=NULL就错误了,具体原因还未知!
{
front=front->link;
}
else//只有一个结点时,front的指向会改变。应分开讨论。
{
front=rear=NULL;
}//front改变,p不随着front改变
curr_len--;
T a=p->data;
delete p;
return a;
}
~queue()
{
curr_len=0;
delete front;
delete rear;
}
};
//在main函数中建立各个栈和队列的联系。
void main()
{
int a;
cout<<"输入每分钟停车的费用:";
cin>>a;
stack<car>s1(2),s2(25);
queue<car>q;
do
{
car car1;
car1.set();
if(car1.t=='E')
{
cout<<"输入结束"<<endl;
break;
}
else if(car1.t=='A')
{//到达的时候输出它的位置。
if(!s1.full())
{
s1.push(car1);
cout<<"车被停到车站从北向南数的第"<<s1.top+1<<"个位置"<<endl;
}//停车场停满了,就停在便道上。
else
{
q.Enqueue(car1);
cout<<"车被停到便道上的第"<<q.curr_len<<"个位置"<<endl;
}
}
//车离开时要输出停在停车场的费用。
else if(car1.t=='D')
{
int j;
int n=0;
for(int i=0;i<=s1.top;i++)
{//在停车场找到它的号码,调用停进停车场的时间计算费用。
if((s1.ElmList[i]).num==car1.num)
{
int m=car1.s-(s1.ElmList[i]).s;
cout<<"停车费用是:"<<a*m<<endl;
j=i;
n++;
}
}
if(!n)//在停车场找不到就说明它没有在停车场停过。
{
cout<<"车牌号输入错误,它没有在停车场停过。"<<endl;
}
//把它的费用计算出来后,还需要将它从停车场调出来
else
{
for(int m=s1.top;m>j;m--)
{
s2.push(s1.pop());//将它后面的车全部放进临时栈中。
}
car car2=s1.pop();//将这辆车pop掉。
while(!s2.empty())
{
s1.push(s2.pop());//然后将刚才临时存放的车又全部放回去。
}
if(!q.empty())//如果便道上有车,就将便道上的车放进停车场去。
{
s1.push(q.Dequeue());
(s1.ElmList[s1.top]).s=car1.s;
//注意,便道上的进停车场时,要改变它的时间,为了以后计算费用打下基础。而车进停车场的时间就是这个车离开的时间。
}
}
}
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -