关于队列的学习(二)
{
Pop(S2,x);
}
else if(StackEmpty(S1){
printf("队列为空");
}
else{
while(!StackEmpty(S1)){
Pop(S1,x);
Push(S2,x);
}
Pop(S2,x);
}
}
复制代码
判断列队为空的算法:
int QueueEmpty(Stack S1,Stack S2){
if(StackEmpty(S1)&&StackEmpty(S2))
return 1;
else
return 0;
}
4、某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船;客车先于货车上渡船,且每上4辆客车,才允许放上一辆货车;若等待客车不足4辆,则以货车代替;若无货车等待,才允许客车都上船。设设计一个算法模拟渡口管理。
算法思想:我们可以设定三个队列,Q 是每次载渡的队列,长度为10。Q1 和Q2 分别是客车和货车的等待队列。若Q1>4,则每取4个Q1元素后再取一个Q2元素,直到Q长度为10。若Q1<4,则直接用Q2补齐。算法实现如下:
复制代码
void manager(Queue q,Queue q1,Queue q2){
int i=0,j=0; //i代表渡船上客车的数量 j代表渡船上总车辆数
while(j<10){
if(!QueueEmpty(q1)&&i<4){ //客车队列非空,且未上满4辆
DeQueue(q1,x);
EnQueue(q,x);
j++;
i++;
}
else if(i==4&&!QueueEmpty(q2)){ //客车已上满4辆
DeQueue(q2,x);
EnQueue(q,x);
j++;
i=0;
}
else{
while(i<4&&!QueueEmpty(q2)){ //客车队列空,且未上满4辆
DeQueue(q2,x);
EnQueue(q,x);
j++;
i++;
}
i=0;
}
if (QueueEmpty(q1)&&QueueEmpty(q1))
j=11;
}
}
复制代码