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 }
测试