1、问题描述

  一列货运列车共有 n节车厢,每节车厢将停放在不同的车站。假定 n个车站的编号分别为1 ~n,货运列车按照第 n站至第 1 站的次序经过这些车站。车厢的编号与它们的目的地相同。为了便于从列车上卸掉相应的车厢,必须重新排列车厢,使各车厢从前至后按编号 1 到n的次序排列。当所有的车厢都按照这种次序排列时,在每个车站只需卸掉最后一节车厢即可。
  

为了重排车厢,需从前至后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足排列要求的车厢,可以直接把它放到出轨上去。如果不是,则把它移动到缓冲铁轨上,直到按输出次序要求轮到它时才将它放到出轨上。缓冲铁轨是按照 L I F O的方式使用的,因为车厢的进和出都是在缓冲铁轨的顶部进行的。在重排车厢过程中,仅允许以下移动:
• 车厢可以从入轨的前部(即右端)移动到一个缓冲铁轨的顶部或出轨的左端。
• 车厢可以从一个缓冲铁轨的顶部移动到出轨的左端。
很容易知道当缓冲铁轨上的车厢编号不是按照从顶到底的递增次序排列时,重排任务将无法完成。
因此新的车厢 u应送入这样的缓冲铁轨:其顶部的车厢编号v 满足v > u,且v 是所有满足这种条件的缓冲铁轨顶部车厢编号中最小的一个编号(若有空的缓冲轨则直接移入空缓冲轨)。只有这样才能使后续的车厢重排所受到的限制最小。

2、代码实现

重排实现:

 1 #include "RailRoad.h"
 2 using std::cout;
 3 using std::cin;
 4
 5 bool RailRoad(int r[], int n, int k)
 6 {
 7     LinkedStack<int> *H;
 8     H = new LinkedStack<int>[k + 1];
 9     int NowOut = 1;//可以直接移入出轨的车厢号
10     int MinH = n+2;//缓冲轨顶部最小的车厢号
11     int MinS;//最小车厢号的缓冲轨号
12     for (int i = 0; i < n;++i)
13     {
14         if (r[i]==NowOut)
15         {
16             cout << "将车厢" << NowOut << "从入轨直接移动到出轨" << std::endl;
17             ++NowOut;
18             while (MinH == NowOut)//检查缓冲轨最小车厢号,相等则输出
19             {
20                 output(MinH, MinS, H, k, n);
21                 ++NowOut;
22             }
23         }
24         else
25         {
26             if(!movetocache(MinH, MinS, H, k, n, r[i]))
27             {
28                 return false;
29             }
30         }
31     }
32
33     return true;
34 }
35 //复杂度O(k)
36 void output(int& MinH, int& MinS, LinkedStack<int> *H, int k, int n)
37 {
38     cout << "将车厢" << MinH << "从缓冲轨" << MinS << "移动到出轨上" << std::endl;
39     H[MinS].Delete(MinH);
40     MinH = n + 2;
41     for (int i = 1; i < k + 1;++i)
42     {
43         if (!H[i].IsEmpty() && H[i].Top()<MinH)
44         {
45             MinH = H[i].Top();
46             MinS = i;
47         }
48     }
49 }
50//复杂度O(k)
51 bool movetocache(int &MinH, int &MinS, LinkedStack<int>* H, int k, int n, int num)
52 {
53
54
55     int besttrack = 0;
56     int BestTop = n + 1;
57     int x;
58     for (int i = 1; i < k + 1;++i)
59     {
60         if (H[i].IsEmpty())
61         {
62             H[i].Add(num);
63             cout << "将车厢" << num << "移动到缓冲轨" << i << std::endl;
64             if (num < MinH)
65             {
66                 MinH = num;
67                 MinS = i;
68             }
69             return true;
70         }
71
72         x = H[i].Top();
73         if (num<x&&x<BestTop)
74         {
75             BestTop = x;
76             besttrack = i;
77         }
78     }
79
80     if (!besttrack)
81     {
82         return false;
83     }
84
85     H[besttrack].Add(num);
86     cout << "将车厢" << num << "移动到缓冲轨" << besttrack << std::endl;
87     if (num < MinH)
88     {
89         MinH = num;
90         MinS = besttrack;
91     }
92
93     return true;
94 }

测试:
 1 #include "RailRoad.h"
 2 #include <iostream>
 3
 4 int main()
 5 {
 6     int n=0, k=0;
 7
 8     while (n<1||k<1)
 9     {
10         std::cout << "车厢节数(>0): ";
11         std::cin >> n;
12         std::cout << "缓冲轨条数(>0):";
13         std::cin >> k;
14     }
15
16
17     int *p = new int[n];
18     std::cout << "输入" << n << "节车厢次序:" << std::endl;
19     int i = 0;
20     while (i<n)
21     {
22         std::cin >> p[i++];
23     }
24
25     if (!RailRoad(p,n,k))
26     {
27         std::cout << "排序失败" << std::endl;
28     }
29
30     system("pause");
31     return 0;
32 }

输出:

转载于:https://www.cnblogs.com/haoliuhust/p/4261182.html

堆栈应用(三):火车车厢重排相关推荐

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

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

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

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

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

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

  4. 072.火车车厢重排

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

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

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

  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. 数据结构与算法 汉诺塔问题和列车车厢重排问题

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

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

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

最新文章

  1. 基于r-Kernel的LiteOS操作系统
  2. 关于vue+webpack的一点配置
  3. pytorch 维度练习
  4. Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
  5. STM32 关于外部中断线、中断源和中断服务函数的问题
  6. jquery 下拉框 select2 运用 笔记
  7. 终于我还是没忍住,用Python爬了一波女神
  8. druid 数据库连接池,简单配置
  9. Jmeter模拟多用户同时登陆
  10. 你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧
  11. C#中获取今天是星期几
  12. 稳健性估计—— M 估计
  13. 基于matlab的gmsk,基于matlab的GMSK综合实训
  14. 内网穿透群晖NAS:免费安装cpolar群晖套件 1/2
  15. Unirech腾讯云代充-关于腾讯云国际版云服务器实例调整配置常见问题
  16. 如何成为早起者(二)
  17. 英特尔凌动处理器_英特尔刷新Atom Denverton低功耗服务器CPU产品线
  18. 及时反馈,让员工尊重你,信任你
  19. 今日头条 爬虫 java_爬虫实例:今日头条爬虫
  20. 第五章.系统安全分析与设计

热门文章

  1. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他。...
  2. 【Java】【Fulme】Flume-NG源代码阅读之SpoolDirectorySource
  3. 数据库设计三大范式详解
  4. 在IPCAM上实现RTSP协议直播-live555 转
  5. SpringBoot之AOP切面的使用
  6. 蓝桥杯 ALGO-67 算法训练 最大值与最小值的计算
  7. 全局变量只能初始化不能赋值
  8. L1-016. 查验身份证-PAT团体程序设计天梯赛GPLT
  9. perl 中文处理 乱码
  10. Windows 10如何强制删除多余的语言包