问题描述

转轨站示意图如下:

重排过程如下:

伪代码

1. 分别对k个队列初始化;
2. 初始化下一个要输出的车厢编号nowOut = 1;
3. 依次取入轨中的每一个车厢的编号;
3.1 如果入轨中的车厢编号等于nowOut,则3.1.1 输出该车厢;3.1.2  nowOut++;
3.2 否则,考察每一个缓冲轨队列for (j=1; j<=k; j++)3.2.1 取队列 j 的队头元素c;3.2.2 如果c=nowOut,则3.2.2.1 将队列 j 的队头元素出队并输出;3.2.2.2  nowOut++;
3.3 如果入轨和缓冲轨的队头元素没有编号为nowOut的车厢,则3.3.1 求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;
3.3.2 如果 j 存在,则把入轨中的第一个车厢移至缓冲轨 j;

晦涩的伪代码简直难啃,我们直接先分析一波这个实现过程

就算火车车厢的顺序打乱了之后,其编号也是连续的,可以利用这个点,所以我们定义三个队列:H1、H2、H3,将打乱的序列入队进H3,同时定义一个nowOut=1,让其自增,遍历序列H3,如当前遍历元素等于nowOut,那就将该元素出队,nowOut自增,否则就去H1和H2队列的对头去找有无等于nowOut的元素,若H1、H2、H3都没有nowOut,那么就将当前遍历的元素放进H1或H2条件是该元素必须大于H1或H2的队尾元素,如此循环完毕,最终可输出排列好的序列。

代码实现

#include <stdio.h>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef int SElemType;
typedef int Status;typedef struct Queue {SElemType data[MAXSIZE];int front;int rear;
} Queue;//初始化队列
void InitQueue(Queue *q) {q->data[0] = 0;q->front = 0;q->rear = 0;
}//入队
Status EnQueue(Queue *q, SElemType num) {if(q->rear >= MAXSIZE - 1) {return ERROR;}q->data[q->rear] = num;q->rear++;return OK;
}//出队
Status DeQueue(Queue *q, SElemType* num) {if(q->front >= q->rear) {return ERROR;}*num = q->data[q->front];q->front++;return OK;
}//获取头元素
Status GetHead(Queue *q, SElemType* num) {if(q->front >= q->rear) {return ERROR;}*num = q->data[q->front];return OK;
}//获取尾元素
Status GetRear(Queue *q, SElemType* num) {if(q->front >= q->rear) {return ERROR;}*num = q->data[q->rear-1];return OK;
}int main() {Queue H1;InitQueue(&H1);Queue H2;InitQueue(&H2);Queue H3;InitQueue(&H3);Queue* QArray[] = {&H1, &H2, &H3};//指向结构体的指针数组,将H1,H2,H3放入数组 printf("请输入火车车厢,输入0停止输入\n");while(true) {//元素全部入队进H3 int num;scanf("%d", &num);if(num == 0) {break;}EnQueue(&H3, num);}
//  int num;
//  GetRear(&H3, &num);
//  printf("%d\n", num);int nowOut = 1;//火车车厢排序的关键 printf("\n出队序列为:");//遍历H3队列 while(H3.front < H3.rear || H1.front < H1.rear || H2.front < H2.rear) {int flag = 0;int num;GetHead(&H3, &num);//如果当前遍历元素等于nowOut就H3对头元素出队 if(num == nowOut) {DeQueue(&H3, &num);printf("%d", num);nowOut++;flag = 1;} else {//否则去寻找H1和H2对头元素是否等于nowOut,等于就出队 for(int i = 0; i < 2; i++) {GetHead(QArray[i], &num);if(num == nowOut){DeQueue(QArray[i], &num);printf("%d", num);nowOut++;flag = 1;}}}/*如果H1,H2,H3的对头都没有等于nowOut的元素,那么就将该元素入队至H1或H2,条件是小于队尾元素 */if(flag == 0){int container;for(int i = 0; i < 2; i++){GetHead(&H3, &num);GetRear(QArray[i], &container);if(num > container || QArray[i]->rear == 0){DeQueue(&H3, &num);EnQueue(QArray[i], num);break;}}}}printf("\n\n2062011002-吴奇\n"); return 0;
}

测试用例

输入:369247185 0为结束符

输出:123456789

最后总结几个可以优化的点,感兴趣的小伙伴可以尝试实现以下

  1. 该算法中用到的是队列的顺序存储结构,想要改为环形只需将出队入队操作的索引稍做修改,就可实现环形队列。
  2. 输入方式比较不雅,可以进一步优化。
  3. 如想实现任意乱序的排列,我认为应再加一个队列,用2个队列作为缓冲轨某些情况下运行不是想象中的结果。

数据结构-火车车厢重排问题(队列实现)相关推荐

  1. java队列火车厢重排_火车车厢重排问题--队列模拟

    ①问题描述 一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号分别为1-n,即货运列车按照第n站至第1站的次序经过这些车站.为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编 ...

  2. java队列火车厢重排_火车车厢重排(链队列)

    1.题目: Problem Description 一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站.为了便于从列车 ...

  3. java队列火车厢重排_火车车厢重排——队列实现

    其实队列和栈挺像的,所以也就没有单独写一个实现队列的笔记,可以参考一下栈的实现:https://www.cnblogs.com/2015-16/p/12957964.html    (同时这一篇也包含 ...

  4. 堆栈应用(三):火车车厢重排

    1.问题描述 一列货运列车共有 n节车厢,每节车厢将停放在不同的车站.假定 n个车站的编号分别为1 ~n,货运列车按照第 n站至第 1 站的次序经过这些车站.车厢的编号与它们的目的地相同.为了便于从列 ...

  5. 072.火车车厢重排

    #include "stdafx.h" #include "stdio.h" #include "iostream.h" #include ...

  6. java队列火车厢重排_火车车厢重排问题

    1 #include 2 #include 3 usingstd::stack;4 usingstd::cin;5 usingstd::cout;6 7 const int MAX = 100; // ...

  7. nullnullC++ Stack Example Rearranging RailRoad Cars 火车车厢重排问题

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 Look at figure 1. The railroad cars  in the "Input track" is ...

  8. 队列的应用--火车车厢重排列

    火车车厢重排列问题 问题描述:一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号为1--n,即货运列车按照第n站至第1站的次序经过这些车站.为了便于列车卸掉相应的车厢,车厢的编号 ...

  9. 数据结构与算法 汉诺塔问题和列车车厢重排问题

    1. 汉诺塔问题: (a)通过递归的方式解决:https://blog.csdn.net/zj1131190425/article/details/85156570 // 汉诺塔问题: 递归解决方案 ...

最新文章

  1. 【TensorFlow2.0】(5) 数学计算、合并、分割
  2. 梦回编程- 由LD_LIBRARY_PATH引发JNI的理解
  3. 技巧:让Eclipse或Flex Builder 支持自动换行。(转)
  4. 南大电子机器人入驻云南_园区优秀企业| 中科恒清清淤机器人,以智能科技为水环境治理保驾护航...
  5. 无线路由器WiFi密码破解
  6. 深信服AC1100上网行为管理
  7. MDK KEIL 下载算法程序 外部存储QSPI FLASH
  8. 如何学习数字通信FPGA设计
  9. 计算机截图工具无法运行,win10系统打开截图工具提示“截图工具当前未在计算机上运行”的解决办法...
  10. IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Che
  11. Unexpected exception parsing XML document from class path resource
  12. 有趣好玩的黑科技网站分享
  13. python分类汇总_数据分析番外篇13_利用Python实现分类汇总
  14. 弟兄胜过他,因为羔羊的血
  15. 微信与支付宝钱包的竞争分析
  16. 【Python量化】布林带策略
  17. 在VS中添加lib的三种方法
  18. 混沌精英哈里斯鹰优化算法-附代码
  19. Python数据分析实战之股票数据
  20. 阅读java源代码的阅读器_TXT小说阅读器java代码

热门文章

  1. 网页设计之CSS实战(5) --- 元素定位
  2. vue输入数字且可以小数点
  3. 炎炎夏日,看小Y重燃烈焰战火——Y450外接显卡
  4. performClick 默认点击
  5. 细雨湿衣看不见,闲花落地听无声
  6. linux 嵌入式程序设计
  7. matlab函数编写实例,Matlab代写代做常见函数调用实例
  8. elementui 表单v-molde是动态的,校验表单字段为必填项
  9. Allegro基本规则设置指导书之Analysis Modes
  10. 跨境9610 与 1210