利用栈的问题解决车厢调度问题
Railroad(int p[],int n,int k){
∥k个缓冲铁轨,车厢初始排序为p[1:n]
∥如果重排成功,返回1,否则返回0
∥创建与缓冲铁轨对应的堆栈
LinkedStack<int>*H;
H=new LinkedStack<int>[k+1];
int NowOut=1; ∥下一次要输出的车厢
int minH=n+l; ∥缓冲铁轨中编号最小的车厢
int minS; ∥minH号车厢对应的缓冲铁轨
∥车厢重排
for(int i=1;i<=n;i++)
if(p[i]==NowOut){∥直接输出t
printf("Move car %d from input to output.\\n",p[i]);
NowOut++;
∥从缓冲铁轨中输出
while(minH==NowOut){
Output(minH,minS,H,k,n);
NowOut++;
}
}
else{ ∥将p[i]送入某个缓冲铁轨
if(!Hold(p[i],minH,minS,H,k,n))
return 0;
}
return 1;
}
下面分别给出了Railroad中所使用的函数Output和Hold。Output用于把一节车厢从缓冲铁轨送至出轨处,它同时将修改minS和minH。函数Hold根据车厢分配规则把车厢c送入某个缓冲铁轨,必要时,它也需要修改minS和minH。
void Output(int& minH,int& minS,LinkedStack<int>H[],int k,int n)
{
∥把车厢从缓冲铁轨送至出轨处,同时修改minS和minH
int c;∥车厢索引
∥从堆栈minS中删除编号最小的车厢minH
H[minS].Delete(c);
printf("Move car %d from holding track %d to output.\\n",minH,minS);
∥通过检查所有的栈顶,搜索新的minH和minS
minH=n+2;
for(int i=1;i<=k;i++)
if(!H[i].IsEmpty()&&(c=H[i].Top())<minH){
minH=c;
minS=i;
}
}