c语言队列实现火车车厢重排
时间: 2023-09-04 14:11:11 浏览: 50
火车车厢重排问题是一个经典的算法问题,可以使用队列来实现。整个算法的思路如下:
1. 从输入中读取火车车厢的序列,并将其存储在一个数组中;
2. 创建一个队列,并将第一个车厢入队;
3. 初始化一个索引变量 i,指向数组中的第二个车厢;
4. 循环执行以下步骤直到索引变量 i 大于等于数组长度:
a. 如果队列中的顶部车厢编号和当前车厢编号是连续的,则将当前车厢入队,并将索引变量 i 加 1;
b. 如果队列中的顶部车厢编号和当前车厢编号不是连续的,则将队列中所有车厢依次出队,并输出它们的编号,直到队列顶部的车厢编号和当前车厢编号是连续的;
5. 循环执行以下步骤直到队列为空:
a. 将队列中的顶部车厢出队,并输出它的编号。
下面是用 C 语言实现该算法的代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
int main() {
int n, i, j, a[MAX_N];
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 创建队列
int front = 0, rear = 0, q[MAX_N];
// 将第一个车厢入队
q[rear++] = a[0];
// 初始化索引变量 i
i = 1;
while (i < n) {
// 如果队列中的顶部车厢编号和当前车厢编号是连续的
if (q[front] == a[i] - 1) {
// 将当前车厢入队
q[rear++] = a[i++];
} else {
// 如果队列中的顶部车厢编号和当前车厢编号不是连续的
// 将队列中所有车厢依次出队,并输出它们的编号
while (front < rear) {
printf("%d ", q[front++]);
}
printf("\n");
}
}
// 处理剩余的车厢
while (front < rear) {
printf("%d ", q[front++]);
}
printf("\n");
return 0;
}
```
输入格式为:
```
6
5 1 4 2 3 6
```
输出结果为:
```
1 2 3
4 5
6
```