问题描述:停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
问题分析:以栈模拟停车场,队列模拟门外的便道,以顺序结构实现栈,链表结构实现队列。

1.停车场显示车辆信息并且计算收费,所以首先定义结构体要包含车辆的这些信息:车牌、进入(离开)的状态、进入(离开)的时间,为了清晰地表示汽车的位置,结构体中还应该设置有表示位置信息的变量。

typedef struct  //时间的数据结构
{
    int hour;
    int minute; 
 }date;
 typedef struct  //汽车的信息数据结构 
 {
    int getleave; //1表示进入,0表示离开
    char number[8];
    int Location;
    date time;
 }car;

2.实现顺序栈和链队的数据结构,分析程序的结构。
(1)有车入场,停车场数据加一
(2)若车辆已满,将车辆信息存入便道
(3)停车场车辆出场,将便道第一辆加进停车场,修改位置信息

3.源代码以及运行结果

#include<iostream>
#include<cstring>
#define ok 1
#define error 0
#define maxsize 3 //停车场的最大容量,根据具体情况设置
using namespace std; 
typedef struct  //时间的数据结构 
{
	int hour;
	int minute;
}date; 
typedef struct  //汽车的信息数据结构 
{
	int getleave;
	char number[8];
	int Location;	
	date time;
}car; 
typedef struct  //构建栈 
{
	car *top;	
	car *base;	
	int stacksize;
}Sqstack;
int Initstack(Sqstack &s) //栈的初始化 
{
	s.base = new car[maxsize];	
	if(!s.base)		
	exit(error);	
	s.top = s.base;	
	s.stacksize = 2;	
	return ok;
} 
int pop(Sqstack &s,car &e)  //出栈 
{
	*s.top--;	
	e = *s.top;	
	return ok;
} 
int push(Sqstack &s,car e)  //入栈 
{
	*s.top = e;	
	*s.top++;	
	return ok;
} 
int Isemptystack(Sqstack &s)  //判断栈是否为空 
{
	if(s.top - s.base == 3)		
	return error;	
	else		
	return ok;
} 
typedef struct QNode  //定义队 
{
	car data;	
	struct QNode *next;
}QNode,*Queueptr;
typedef struct
{	
	Queueptr front;	
	Queueptr rear;
}LinkQueue; 
int InitQueue(LinkQueue &Q) //初始化队列 
{
	Q.front = Q.rear = new QNode;	
	Q.front->next = NULL;	
	return ok;
} 
int InQueue(LinkQueue &Q,car e)  //入队 
{
	QNode *p;	
	p = new QNode;	
	p->data = e;	
	p->next = NULL;	
	Q.rear->next = p;	
	Q.rear = p;	
	return ok;
} 
int OutQueue(LinkQueue &Q,car &e)  //出队 
{
	QNode *p;	
	p = new QNode;	
	p = Q.front->next;	
	e = p->data;	
	Q.front->next = p->next;	
	if(Q.rear = p)		
	Q.rear = Q.front;	
	delete p;	
	return ok;
} 
int howlong(int hour1,int minute1,int hour2,int minute2) //计算时间 
{return (hour2 - hour1) * 60 + (minute2 - minute1);} 

car gettop(Sqstack s){	return *(s.top - 1);} 
int main()
{
	Sqstack park,temp;	
	LinkQueue lane;	
	Initstack(park);	
	Initstack(temp);	
	InitQueue(lane);	
	int price = 2 ,location1 = 0 ,location2 = 0;	
	while(1)	
	{	
		car one;		
		cout<<"输入车牌号:";		
		cin>>one.number;		
		if(strcmp(one.number,"########") == 0)			
		break;		
		cout<<"输入时刻:";		
		cin>>one.time.hour>>one.time.minute; 		
		cout<<"输入进出状态:";		
		cin>>one.getleave;		
		switch(one.getleave)
		{
		case 1:	if(Isemptystack(park))	
		{		
			push(park,one);		
			location1++;		
			one.Location = location1;		
			cout<<"车辆在停车场的位置为:"<<one.Location<<endl;
			cout<<"********************************************" <<end	
			}	
			else	
			{	
				InQueue(lane,one);		
				location2++;		
				one.Location = location2;		
				cout<<"车辆在便道的位置为:"<<one.Location<<endl;
				cout<<"********************************************" <<end	
			}	
				break;
		case 0:	int hour,minute,i;	
		car e,t;	
		do	
		{	
			pop(park,e);		
			push(temp,e);	
		}
		while(strcmp(e.number,one.number) != 0);	
		cout<<"出车车牌为:"<<one.number<<endl;
		cout<<"出车时间为:"<<one.time.hour<<":"<<one.time.minute<<endl;
		cout<<"停车费用为:"<<howlong(e.time.hour,e.time.minute,one.time.hour,one.time.minute) * price<<"元"<<endl;				
		cout<<"********************************************" <<endl;				
		while(temp.top != temp.base)				
		{			
				pop(temp,t);					
				push(park,t);					
				t.Location--;
		}				
				OutQueue(lane,e);				
				e.Location = maxsize;				
				push(park,e);				
				location2--;				
				break;			
		default: 
		break;		
		} 	
		}	
		return 0;
		}

运行结果:

运行结果如上图

Logo

快速构建 Web 应用程序

更多推荐