2021-04-08

车辆渡江问题(数据结构队列的应用)

  某汽车轮渡口,过江渡船每次能载10辆车过江,过江车辆分为客车类和货车类,上渡船有如下规定:
  同类车先到先上船;客车先于货车上渡船,且每上4辆客车,才允许上一辆货车;
  若等待的客车不足4辆,则以货车代替;若无货车等待,允许客车都上船。
  试设计算法模拟以上渡口管理。
  提示:设计三个队列,分别为过江渡渡船队列、客车队列、货车队列。
#include<stdio.h>
#include<stdlib.h>
#define maxferry 11
#define max 100
#define error -1
#define ok 1
typedef char QElemType;
typedef int Status;
//定义顺序结构的队列
typedef struct{
QElemType *base;
int front;
int rear;
}ferryqueue,busqueue,truckqueue;
//队列初始化
Status initqueue(ferryqueue &F)
{
	F.base=new QElemType[maxferry];
	if(!F.base) return error;
	F.rear=F.front=0;
	return ok;
}
Status initqueuem(ferryqueue &F)
{
	F.base=new QElemType[max];
	if(!F.base)  return error;
	F.rear=F.front=0;
	return ok;
}
//入队
Status enqueue(ferryqueue &F,QElemType e)
{
if((F.rear+1)%maxferry==F.front) return error;
	 F.base[F.rear]=e;
	 F.rear=(F.rear+1)%maxferry;
	return ok;
}
//出队
Status dequeue(ferryqueue &F,QElemType &e)
{
	if(F.front==F.rear) return error;
	e=F.base[F.front];
	F.front=(F.front+1)%maxferry;
	return e;
}
//bus入队
Status busenqueue(busqueue &B,int bus,char x)
{
	int i;
	if(bus>100) printf("data error!");
	else {
	for(i=0;i<bus;i++)
	{
    enqueue(B,x);
	}}
	return ok;
}
//truck入队
Status truckenqueue(truckqueue &T,int truck,char y)
{
	int i;
    if(truck>100) printf("data error!");
	else {
	for(i=0;i<truck;i++)
	{
    enqueue(T,y);
	}}
	return ok;
}
//判断队列是否为空
Status isempty(ferryqueue &F)
{if(F.rear==F.front)
 return 0;
else
 return 1;
}
//打印函数
void printqueue(ferryqueue F,int j)
{
	char ch;int i;	
	printf("第%d辆的运船顺序为:\n",j);
	for(i=0;i<10;i++)
		{ch=dequeue(F,ch);printf("%3c",ch);}
	printf("\n");
}
void main()
{
	int bus=0,truck=0,total=0,i,k,j;
	QElemType x='*',y='#',e;
	ferryqueue F;
	busqueue B;
	truckqueue T;
    initqueue(F);initqueuem(B);initqueuem(T);
	//bus入队
	printf("请输入客车入队元素的个数:");
	scanf("%d",&bus);
	//truck入队
	printf("请输入货车入队元素的个数");
	scanf("%d",&truck);
	k=(bus+truck)/10+1;
	for(j=0;j<k;j++)
	{
		initqueue(F);initqueuem(B);initqueuem(T);
		busenqueue(B,bus,x);
		truckenqueue(T,truck,y);
		if(bus+truck>10)
	{
		while(total<maxferry)
    {
			for(i=0;i<4&&total<10;i++)
			{if(isempty(B)==0) break;
			dequeue(B,e);enqueue(F,e);bus--;total++;
			}
		if(isempty(T)!=0)
			{dequeue(T,e);enqueue(F,e);truck--;total++;}
		}
		total=0;truck=truck+1;
		printqueue(F,j+1);
	}
	else if(bus+truck<=10)
	{
		total=0;
		while(total<bus+truck)
		{for(i=0;i<4;i++)
		{if(isempty(B)==0) break;
		dequeue(B,e);enqueue(F,e);total++;}
		if(isempty(T)!=0)
			{dequeue(T,e);enqueue(F,e);total++;}
		}
		printqueue(F,j+1); break;
	}
	}
	}

结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值