利用队列结构实现车厢重排问题。车厢重排问题如下: 一列货车共有 n 节车厢,每个车厢都有自己的编号,编号范围从 1~n。给定任意次序的 车厢,通过转轨站将车厢编号按顺序重新排成 1~n。转轨站共有 k 个缓冲轨,缓冲轨位于入 轨和出轨之间。开始时,车厢从入轨进入缓冲轨,经过缓冲轨的重排后,按 1~n 的顺序进入 出轨。缓冲轨按照先进先出方式,编写一个算法,将任意次序的车厢进行重排,输出每个缓 冲轨中的车厢编号。 提示: 1、 一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨, 重新编排
时间: 2023-06-04 14:04:21 浏览: 173
的车厢也从出轨中按顺序进入不同缓冲轨。
2、可使用队列来模拟缓冲轨的先进先出方式。
算法流程如下:
1. 从入轨开始,依次将车厢入队;
2. 当缓冲轨队列不满时,从入轨队列出队一个车厢,进入缓冲轨队列;
3. 当缓冲轨队列已满时,出队一个车厢并输出(表示重排完成),然后将缓冲轨队列中的最后一个车厢插入到入轨队列的队头,继续判断缓冲轨队列是否满,循环执行步骤2和3,直到入轨队列为空;
4. 最后,按顺序输出出轨队列中的车厢编号。
代码如下:
```
#include <stdio.h>
#include <queue>
using namespace std;
int main()
{
int n, k;
printf("请输入车厢数量和缓冲轨数量(以空格分隔):");
scanf("%d %d", &n, &k);
queue<int> in, out, buffer[k+1];
// in:入轨队列
// out:出轨队列,用于存储重排后的车厢
// buffer[i]:第i个缓冲轨队列
for(int i=1; i<=n; i++)
{
int num;
printf("请输入第%d个车厢编号:", i);
scanf("%d", &num);
in.push(num); // 将车厢入队
}
while(!in.empty())
{
int cur = in.front();
in.pop();
bool flag = false; // 标识缓冲轨队列是否已满
for(int i=1; i<=k; i++)
{
if(buffer[i].empty() || buffer[i].back() > cur)
{
buffer[i].push(cur);
flag = true;
break;
}
}
if(!flag) // 如果所有缓冲轨队列都已满
{
int minn = buffer[1].front(), idx = 1;
for(int i=2; i<=k; i++) // 找到编号最小的缓冲轨队列
{
if(buffer[i].front() < minn)
{
minn = buffer[i].front();
idx = i;
}
}
buffer[idx].pop(); // 将该队列的队头出队并输出
printf("%d ", minn);
buffer[idx].push(cur); // 将当前车厢插入到该队列的队尾
}
}
// 将所有缓冲轨队列中的车厢依次出队并加入到出轨队列中
for(int i=1; i<=k; i++)
{
while(!buffer[i].empty())
{
out.push(buffer[i].front());
buffer[i].pop();
}
}
// 输出出轨队列中的车厢编号
printf("\n重排后的车厢编号为:");
while(!out.empty())
{
printf("%d ", out.front());
out.pop();
}
printf("\n");
return 0;
}
```
阅读全文