本题摘自王道数据结构栈与队列的应用的课后题,题目如下:
某汽车轮渡口,过江渡船每次能载10辆汽车过江。过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船,客车先于货车上船,且每上4辆客车,才允许放上一辆货车;若等待客车不足4辆,则以货车替代;若无货车等待,允许客车都上船。试设计一个算法模拟渡口管理。
乍一看题目好像很复杂,但是,仔细读一下,发现无非就是几种情况而已。从这个同类车先到先上船,我们就可以考虑到这道题需要利用队列FIFO的性质。
王道书中所给的算法设计思想是:假设数组q的最大下标为10,恰好是每次载渡的最大量。假设客车的队列是q1,货车的队列为q2。若q1充足,则每取4个q1元素后再取一个q2元素,直到q的长度为10。若q1不充足,则直接用q2补齐。算法的实现如下:
void Manager(SqQueue *q,SqQueue *q1,SqQueue *q2){
char x;
int i=0,j=0;//i表示渡船上的客车数量,j表示渡船上的总车辆数
while(j<10){
if(!IsEmpty(q1)&&i<4){
DeQueue(&q1,&x);
EnQueue(&q,x);
i++;
j++
}
else if(i==4&&!IsEmpty(q2)){
DeQueue(&q2,&x);
EnQ