数据结构算法问题 栈与队列的应用

本文介绍了一个使用栈和队列的数据结构来模拟停车场管理的程序。该程序能够处理汽车的到达和离开,通过栈模拟停车场,队列模拟便道,确保正确的停车顺序并计算停车费用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include<iostream>
#include<string>
#define stack_init_size 2
//#define stackincrement 10
using namespace std;

struct stack//栈
{
	char *base;
	char *top;
	int size;
};
struct queue//队列
{
	char number[20]; 
	queue *next;
};
queue *head=NULL;
queue *tail=NULL;
queue *vernier=NULL;
void creatQueue()//创建队列
{
	head=tail=vernier=new queue;
	cout<<"输入车的车牌号:"<<endl;
	cin>>tail->number;
	tail->next=NULL;
}
void addQueue()//新驶入的车
{
	tail->next=new queue;
	vernier=tail;
	tail=vernier->next;
	cout<<"输入车的车牌号:"<<endl;
	cin>>tail->number;
	tail->next=NULL;
}
void delQueue()//一辆车进入车站
{
	vernier=head->next;
	head->next=NULL;
	//去掉头
	head=vernier;
}
int position(char e[20])//在字符数组中找某一字符的位置
{
	int i=0;
	//int len=strlen(e);
	//为什么 int len=strlen(e)不行?
	for(i=0;i<strlen(e);i++)
	{
		if(e[i]==',')
		{
			return i;
			break;
		}
	}
}
void cut(char a[20],const char b[20],int c,int d)//在字符数组b中的位置c,d之间截取一段存于a
{
	int i;
	int len1=strlen(b);
	if(d>len1||c>d)
	{
		cout<<"信息有误";
	}
	else
	{
		for(i=c;i<d;i++)
		{
			a[i-c]=b[i];
		}
	}
}
bool isEmpty(stack s)//判断是否为空
{
	if(s.base!=s.top)  return false;
	else return true;
}
bool isFull(stack s)//判断是否满
{
	if(s.top-s.base>=s.size)  return true;
	else return false;
}
bool isMateTwo(char a[20],char b[20])//比较两个字符数组的前两位返回bool
{
	int i=0;
	for(i=0;i<2;i++)
	{
		if(a[i]!=b[i])
		{
			return false;
			break;
		}
		return true;
	}
}
void creatNewStack(stack &s)//创建新栈
{
	s.base=(char *)malloc(stack_init_size * sizeof(char));
	if(!s.base)exit(OVERFLOW);//s.base=null时
	s.top=s.base;
	s.size=stack_init_size;
}
void push(stack &s,char e[20])//添加新项(开入新车)
{
	*s.top=e[20];
	s.top++;
}
void pop(stack &s1,stack &s2)//删除项(s1中栈顶取出并且存在s2中)
{
	char e[20]="";
	if(s1.top==s1.base)
	{
		cout<<"错误!!"<<endl;
		return ;
	}
	e[20] =*--s1.top;
	push(s2,e);
	/*
	s2.top=s1.top;
	s2.top++;
	s1.top--;
	*/
}
void main()
{
	stack s1,s2;
	char e[20]="",e1[20]="",e2[20]="",e3[20]="",e4[20]="",e5[20]="";//赋初值
	int i=0,k=0,h=0,j=0,t=0;
	/*int n;
	cout<<"输入车站所能容纳的车数量:";
	cin>>n;*/
	//创建新站
	creatNewStack(s1);//车站内
	creatNewStack(s2);//车站内的车出来时后面的车停放
	//输入汽车进站还是出站
	while(1)
	{
		char in_out;
		int num,time1,time2;
		cout<<"输入汽车进出信息(“1”表示到站,“2”表示出站,“3”表示输入结束):";
		cin>>in_out;
		if(in_out=='1')//输入到站执行
		{
			//先判断车站是否满
			if(isFull(s1))
			{
				cout<<"车站已满,请在便道上等候"<<endl;
				//进行便道上队列的排放
				if(head==NULL)//先判断便道上有没有车
				{
					creatQueue();
				}
				else
				{
					addQueue();
				}
			}
			else
			{
				cout<<"输入到站车辆的车牌号与到站时间(车牌号为两位,中间以逗号隔开):";
				cin>>e;//以字符数组的形式存储汽车的信息
				//执行添加项函数
				int len2=strlen(e);
				k=position(e);
				cut(e1,e,0,k);//子数组来表示车牌号
				if(strlen(e1)>2)
				{
					cout<<"车牌号为两位!"<<endl;
					return ;
				}
				cut(e2,e,k+1,len2);//子数组来表示到站时间
				//将字符型数组转换为整数
				num=atoi(e1);
				time1=atoi(e2);
				cout<<"车牌号码:"<<num<<"   "<<"到站时间:"<<time1<<endl;
				push(s1,e);
				h++;
			}
		}
		else if(in_out=='2')//输入出站执行
			{
				if(isEmpty(s1))//车站空则没车能开出
				{
					cout<<"车站空!"<<endl;
					return;
				}
				cout<<"输入出站车辆的车牌号码与出站时间(车牌号为两位,中间以逗号隔开):";
				cin>>e;//以字符数组的形式存储汽车的信息
				//执行删除项函数
				int len2=strlen(e);
				k=position(e);
				cut(e1,e,0,k);//子数组来表示车牌号
				if(strlen(e1)>2)
				{
					cout<<"车牌号为两位!"<<endl;
					return ; 
				}
				cut(e2,e,k+1,len2);//子数组来表示到站时间
				//将字符型数组转换为整数
				num=atoi(e1);
				time2=atoi(e2);
				//cout<<"车牌号码:"<<num<<"   "<<"出站时间:"<<time2<<endl;
				t=h;
				for(i=0;i<h;i++)//将一个栈中的数据有序移到另外一个栈
				{
					e3[20]=*s1.top;
					if(!isMateTwo(e1,e3))
					{
						pop(s1,s2);
						j++;
					}
					else
					{
						cout<<"出站车辆的车牌号码与出站时间为:"<<e3<<endl;
						e3[20]=NULL;//去掉选中的值
						s1.top--;
						cout<<"收取费用(一单位时间一元):"<<(time2-time1)*1<<"元"<<endl;
						break;
					}
					t--;
				}
				h=t;
				t=j;
				for(i=0;i<j;i++)
				{
					pop(s2,s1);
					h++;
					t--;
				}
				j=t;
				//便道上第一辆车开进
				cout<<"便道上车牌号为"<<head->number<<"的车开进车站"<<endl;
				strcat(head->number,",");
				strcat(head->number,e2);
				push(s1,head->number);
				delQueue();//删去便道中该车牌号的车
			}
			else if(in_out=='3')
				{
					cout<<"结束输入";
					break;
				}
				else
				{
					cout<<"输入有误!请重新输入";
				}
	}
	system("pause");
}   

设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。

试为停车场编制按上述要求进行管理的模拟程序

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。

需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值