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

📄 停车场管理.cpp

📁 设停车场内只有一个可停放n辆汽车的狭长通道
💻 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 + -