火车车厢重排列问题
问题描述:一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号为1--n,即货运列车按照第n站至第1站的次序经过这些车站。为了便于列车卸掉相应的车厢,车厢的编号应与车站的编号相同。使各个车厢按1~n次序排列,这样每次卸掉最后一节车厢即可.所以给定任意次序的车厢,必须重排列它们.可排列的地方是转轨站,转轨站由一个入轨站,一个出轨站,缓冲轨k个.列车由入轨站进站,经过缓冲轨,出轨.开始时,n节车厢从入轨进入入轨站,转轨结束后按照1-n的次序出轨.假定缓冲轨具有先进先出的特性,且禁止将车厢从缓冲轨移址入轨,将出轨移至缓冲轨.假设有k个缓冲轨,则可以用来暂存车厢的为k-1个,另一个直接出轨.
分析:将车厢C移至缓冲轨时,应该移到这样的缓冲轨:队尾元素小于车厢C,如果有多个这样的缓冲轨,选择队尾元素最大的;否则,选择一个空的缓冲轨.将定有n节车厢,初始排列次序已定,给定k个缓冲轨,用nowOut表示当前到出轨的车厢序号,则有火车厢重排列伪算法如下:
1.初始化k个队列;
2.置nowOut为初始值1,依次取出火车车厢元素与newOut比较:
1)如果newOut == 元素:
输出车厢序号;
newOut++;
2)否则,考察每个缓冲区队列
for(int i = 0; i<k; i++)
1)取队列头元素C:
如果c == newOut;出列,NewOut++;
如果没有队头元素 == newOut:
求小于入轨车厢编号的最大队尾元素所在队列j;

如果j存在,将其放入j队列;否则,查看是否有空缓冲区,否则车厢无法重排列.

源码实现,本例应用了前面实现的链队列,关于链队列实现请参照前面的章节:

bool RearrangeMent(int array[], int nLen, int BufferCount)
{if (nLen <= 0 || BufferCount <= 0){return false;}// 初始化BufferCount个缓冲轨队列CLinkQueue<int>* pQueueArray = new CLinkQueue<int>[BufferCount];int newOut = 1;int j = nLen - 1;while (newOut<=nLen) // 直到最大的车厢出轨{if (j >=0 && array[j] == newOut) // 如果当前火车序号是要出的序号,直接出轨{printf("%d, ", newOut);newOut++;j--;}else // 否则,循环判断每个队列头元素{bool bQueueHave = false;for (int k = 0; k<BufferCount; k++){if (!pQueueArray[k].Empty()){int front = pQueueArray[k].GetQueue();if (front == newOut) // 头元素是要出的车厢,出列.{pQueueArray[k].DeQueue();printf("%d, ", front);newOut++;bQueueHave = true;break;}}}if(j >= 0 && !bQueueHave)// 没有符合条件的元素,找到此车厢需要放入的队列{int nMax = 0;int nQueue = -1; // 应该入的队列for (int m = 0; m<BufferCount; m++){if (!pQueueArray[m].Empty()){int Dis = array[j] - pQueueArray[m].GetRear();if (Dis > 0 && Dis>nMax){nMax = Dis;nQueue = m;}}}bool bFind = false; // 是否存在空队列容纳此元素if (nQueue != -1) // 找到队列入队{pQueueArray[nQueue].EnQueue(array[j]);j--;continue;}else{for (int n = 0; n<BufferCount;n++){if (pQueueArray[n].Empty()){bFind = true;pQueueArray[n].EnQueue(array[j]);j--;break;}}}if (!bFind){return false;}}}// else } // whiledelete[] pQueueArray;return true;
}

测试代码:

 int array[] = {5,8,1,7,4,2,9,6,3};RearrangeMent(array, sizeof(array)/sizeof(int), 2);

输出结果:

队列的应用--火车车厢重排列相关推荐

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

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

  2. 数据结构-火车车厢重排问题(队列实现)

    问题描述 转轨站示意图如下: 重排过程如下: 伪代码 1. 分别对k个队列初始化: 2. 初始化下一个要输出的车厢编号nowOut = 1; 3. 依次取入轨中的每一个车厢的编号: 3.1 如果入轨中 ...

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

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

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

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

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

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

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

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

  7. 072.火车车厢重排

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

  8. 火车车厢座位分布指南

    座位号尾数是0.4.5.9的靠窗. 无列车长办公席的车厢 排列如下: 窗|5 6 7|过|8 9|窗 窗|0 1 2|道|3 4|窗 另外没有0号的座,是从1号开始的,所以1号也靠窗. 有列车长办公席 ...

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

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

最新文章

  1. Python 中 zip() 函数的用法
  2. protobuf和socket通信简单实例
  3. fedora14 an mysql_Fedora 14下 MySQL 更改密码
  4. java arraylist排序_Java 开发者最容易犯的10个错误【译】
  5. Word中以交叉引用的方式插入参考文献
  6. java txtreader_一个简单的Java读写文件例子
  7. 网络安全比赛理论答题(四)
  8. 李宏毅机器学习作业1:预测PM2.5(含训练数据)
  9. 数据库开发——MySQL——单表查询
  10. 最新版Byte Buddy完全支持Java 11
  11. treeview 文字垂直方向_word文本排版技巧:改变文字方向的这些方法,你知道吗?...
  12. android 字体切换快捷键,Android stdio 字体设置及快捷键
  13. 漏洞复现之(MS17-010)
  14. Looksery Cup 2015 A. Face Detection
  15. 如何克隆LINUX硬盘:4种方法
  16. HAL库自学笔记#1【通用TIM定时器】
  17. 这9个技巧让你的PyTorch模型训练得飞快!
  18. 用PaddlePaddle进行图像分割
  19. 抖音帐号如何避免播放量限流、降权和封号
  20. 时序预测 | MATLAB实现LSTM长短期记忆神经网络时间序列预测

热门文章

  1. 模拟算法考试训练题和答案1
  2. Microsoft Virtual WiFi Miniport Adapter 使用方法
  3. 聊一聊麦克风阵列技术:语音交互应该选用怎样的方案?(转载)
  4. STM32 SWD 只能下载一次的问题
  5. Pr:Lumetri 范围
  6. 上拉电阻的作用原理_电容触摸屏原理以及敦泰TP FT5X06驱动
  7. 详解java人力外包的费用组成
  8. python2 x和python3 x_python2.x 和python3.x 哪个比较好?老男孩Python
  9. matlab仿真单关节机器人,用MATLAB玩转机器人--第六章 用MATLAB玩转单关节机器人
  10. Python教程系列(一)—— Python基础教程之导言