之前写了用栈实现的列车车厢重排问题,现在来实现用队列的列车车厢重排问题,用队列要比用栈简单。
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,如果有多个缓冲轨道都满足这一条件,则选择左端车厢编号最大的缓冲轨道;否则选择一个空的缓冲轨道(如果有的话)