C++ 解决列车重排问题

问题节选自<<数据结构、算法与应用(C++语言描述)>>, 思路与代码为原创, 如有疏漏及问题欢迎指正

 

问题描述:

  一辆列车有n节车厢, 车厢排列乱序(如: 284657139), 但整体车厢序号连续(序号整体没有断), 每节车厢要停靠不同的站台.

现有n个车站从1到n编号, 列车按照从1到n的顺序经过车站, 列车要在车厢号和车站号相同时, 将车厢卸下, 为了便于卸载, 需

要将车厢重新顺序排列. 重排后列车只需每次卸下最后一节车厢即可, 为了方便重排, 现有入轨道, 出轨道以及三个缓冲轨道,

规定列车从入轨道入, 可将当前入轨车厢转入缓冲轨道或直接移至出轨道, 缓冲轨道中的车厢可按从后至前的顺序移至出轨

道, 列车出轨道后即完成重排.

抽象:

  即现有一顺序混乱的栈结构, 要将栈内元素重排, 有三个缓冲栈和一个重排后的结果栈

思路:

第一步: 用一变量记录当前结果栈需要的元素值, 之后初始栈元素顺序出栈, 出栈同时判断是否是结果栈所需要的元素, 是则直接

加入结果栈并将当前记录值减一, 否则将元素推入缓冲栈.

第二步: 元素入缓冲栈时对三个缓冲栈从左至右进行检查, 若栈为空, 直接将元素入栈, 否则判断当前栈的栈顶元素值是否小于当

前元素, 是则推入栈中, 否则跳至下一缓冲栈进行检查.

第三步: 对当前三个缓冲栈进行检查, 若当前三个缓冲栈中任意一栈的栈顶元素满足结果栈需求, 将该元素加入结果栈并将记录值

减一, 重复当前步骤, 直至缓冲栈栈顶元素均不满足要求.

重复以上三步即可完成重排

代码如下:

  1 #include <iostream>
  2 #include <stack>
  3 #include <vector>
  4 
  5 #define BUFFER_COUNT 2
  6 #define BUFFER_START 0
  7 
  8 static int train_number = 9;                    //当前重排列车需求
  9 
 10 std::vector<std::stack<int>> vec_buffer_stack;  //缓冲轨道
 11 std::stack<int> train;                          //初始列车
 12 std::stack<int> rearrange_train;                //重排列车
 13 
 14 void train_init()
 15 { 
 16   train.push(5);
 17   train.push(8);
 18   train.push(1);
 19   train.push(7);
 20   train.push(4);
 21   train.push(2);
 22   train.push(9);
 23   train.push(6);
 24   train.push(3);
 25 }
 26 
 27 void check_train()
 28 {
 29   if (train.empty())
 30   {
 31     return;
 32   }
 33   
 34   //当前出栈元素符合重排需求,加入重排列车
 35   if (train.top() == train_number)
 36   {
 37     std::cout << "from current train, rearrange train input " << train.top() << std::endl;
 38 
 39     rearrange_train.push(train.top());
 40     train.pop();
 41     --train_number;
 42   }
 43 }
 44 
 45 void check_buffer()
 46 {
 47   for (size_t i = BUFFER_START; i <= BUFFER_COUNT; ++i)
 48   {
 49     if (!vec_buffer_stack[i].empty())
 50     {
 51       //缓冲轨道中车厢符合重排需求,车厢加入重排列车
 52       if (vec_buffer_stack[i].top() == train_number)
 53       {
 54         std::cout << "from buffer " << i << ", rearrange train input " << vec_buffer_stack[i].top() << std::endl;
 55         
 56         rearrange_train.push(vec_buffer_stack[i].top());
 57         vec_buffer_stack[i].pop();
 58         --train_number;
 59 
 60         //继续检查缓冲轨道
 61         check_buffer();
 62         break;
 63       }
 64     }
 65   }
 66 }
 67 
 68 void push_train()
 69 {
 70   if (train.empty())
 71   {
 72     return;
 73   }
 74   for (size_t i = BUFFER_START; i <= BUFFER_COUNT; ++i)
 75   {
 76     //缓冲轨道为空,直接将车厢加入
 77     if (vec_buffer_stack[i].empty())
 78     {
 79       std::cout << "buffer " << i << " push " <<  train.top() << std::endl;
 80 
 81       vec_buffer_stack[i].push(train.top());
 82       train.pop();
 83 
 84       break;
 85     }
 86     //车厢序号大于缓冲轨道尾车厢序号,加入当前车厢
 87     else if (train.top() > vec_buffer_stack[i].top())
 88     {
 89       std::cout << "buffer " << i << " push " <<  train.top() << std::endl;
 90 
 91       vec_buffer_stack[i].push(train.top());
 92       train.pop();
 93 
 94       break;
 95     }
 96   }
 97 }
 98 
 99 void rearrange_curr_train()
100 {
101   //检查当前结果栈需求车厢号
102   while (train_number != 0)
103   {
104     //车厢出栈检查
105     check_train();
106 
107     //车厢加入缓存
108     push_train();
109 
110     //缓存检查
111     check_buffer();
112   }
113   
114 }

测试

posted @ 2020-02-28 14:34  public_tsing  阅读(968)  评论(0编辑  收藏  举报