车辆渡江问题(数据结构队列的应用)
某汽车轮渡口,过江渡船每次能载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;
}
}
}
结果如下