列车车厢重排就是有一个条铁轨,铁轨有入口和出口,入口和出口之间有三个3个缓冲轨道,缓冲轨道以栈的形式运行,一列货车上有若干个车厢,但是他们的编号是杂乱的,我们想通过这个转轨站,将列车的编号进行重新排列。
arrayStack<int> *track;
int numberOfCars;//轨道缓冲数组
int smallestCar;
int numberOfTracks;//在缓冲轨道中编号最小的车厢
int itsTrack;//停靠着最小编号的缓冲轨道的轨道
bool railroad(int inputOrder[],int theNumberOfCars,int theNumberOfTracks)
{
numberOfCars=theNumberOfCars;
numberOfTracks=theNumberOfTracks;
track=new arrayStack<int>[numberOfTracks+1];
int nextCarToOutput=1;
smallestCar=numberOfCars+1;
for(int i=1;i<numberOfCars;i++)
if(inputOrder[i]==nextCarToOutput)
{
cout<<"Move car"<<inputOrder[i]<<"from input track to output track"<<endl;
nextCarToOutput++;
while(smallestCar==nextCarToOutput)
{
outputFromHoldingTrack();
nextCarToOutput++;
}
}
else
if(!putInHoldingTrack(inputOrder[i]))
return false;
return true;
}
主程序,当入口编号刚好满足要求则直接输出到出口,否则入栈,然后判断栈顶元素是否满足要求,
满足则出栈。
void outputFromHoldingTrack()
{
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].top()<smallestCar))
{
smallestCar=track[i].top();
itsTrack=i;
}
}
这个程序用来将最小栈顶元素输出到出口
bool putInHoldingTrack(int c)
{//将车厢c移动到一个缓冲轨道。返回false,当且仅当没有可用的缓冲轨道
//为车厢c寻找最合适的缓冲轨道
//初始化
int bestTrack=0,bestTop=numberOfCars+1;//同样的寻找最小值的套路
//扫描缓冲轨道
for(int i=1;i<=numberOfTracks;i++)
//下面这个if寻找最好的栈进行压入
if(!track[i].empty())//如果栈非空
{
int topCar=track[i].top();//获取栈顶元素
if(c<topCar&&topCar<bestTop)//只有当该栈顶元素为所有栈顶元素中最小的那一个,且c小于该栈顶元素才将c压入该栈。
{
bestTop=topCar;
bestTrack=i;
}
}
else
if(bestTrack==0) bestTrack=i;
if(bestTrack==0) return false;
track[bestTrack].push(c);
cout<<"Move car"<<c<<"from input track"<<"to holding track"<<bestTrack<<endl;
if(c<smallestCar)//将c压入栈顶后,更新smallestCar和itsTrack.
{
smallestCar=c;
itsTrack=bestTrack;
}
return true;
}
当入口来了一个车厢,如果该车厢不能直接移到出口,那么就将其压入栈中,这个程序用于寻找适当的栈
进行压入,合适的栈的要求,栈顶元素最小,且新入栈的元素要小于这个栈顶元素。