用队列实现列车车厢重排

之前写了用栈实现的列车车厢重排问题,现在来实现用队列的列车车厢重排问题,用队列要比用栈简单。

void outputFromHoldingTrack()
{//将编号最小的车厢从缓冲轨道移到出轨道
 //从栈itsTrack中删除编号最小的车厢
 track[itsTrack].pop();
 cout<<"Move car"<<smallestCar<<"from holding track"<<itsTrack<<"to output track"<<endl;
 //检查所有栈的栈顶,寻找编号最小的车厢和它所属的栈
 smallestCar=numberOfCars+2;//熟悉的套路
 for(int i=1;i<=numberOfTracks;i++)
 {
     if(!track[i].empty()&&track[i].front()<smallestCar)
     {
         smallestCar=track[i].front();
         itsTrack=i;
     }
 }
}

bool putInHoldingTrack(int c)
{//将车厢C移到一个缓冲轨道。返回false,当且仅没有可用的缓冲轨道
//为车厢c寻找最合适的缓冲轨道
//初始化
int bestTrack=0,bestLast=0;
//扫描缓冲轨道
for(int i=1;i<=numberOfTracks;i++)
    if(!track[i].empty())
    {
        int lastCar=track[i].back();
        if(c>lastCar&&lastCar>bestLast)
        {//缓冲轨道i的尾部具有编号更大的车厢
          bestLast=lastCar;
          bestTrack=i;
        }
    }
    else
        if(bestTrack==0)
            bestTrack=i;
if(bestTrack==0)
    return false;
//把车厢c移到轨道bestTrack
track[bestTrack].push(c);
cout<<"Move car"<<c<<"from input track"<<"to holding track"<<bestTrack<<endl;

if(c<smallestCar)//这句话仅当三个车厢没有装满之前或者top=last之前是有用的。
{
    smallestCar=c;
    itsTrack=bestTrack;
}
return true;

}

当一节车厢c进入缓冲轨道时,一句如下的 原则来选择缓冲轨道:缓冲轨道上已有的车厢其编号均小于c,如果有多个缓冲轨道都满足这一条件,则选择左端车厢编号最大的缓冲轨道;否则选择一个空的缓冲轨道(如果有的话)

猜你喜欢

转载自blog.csdn.net/du_shuang/article/details/81179741