生成所有的出栈序列 (回溯法)
来源:互联网 发布:网络电子游戏官网 编辑:程序博客网 时间:2024/04/30 08:31
给定一个入栈序列,找出所有可能的出栈序列。
如入栈序列为 [1, 2, 3]
则可能的出栈序列为 :
[ 3 2 1 ]
[ 2 3 1 ]
[ 2 1 3 ]
[ 1 3 2 ]
[ 1 2 3 ]
采用回溯法和递归统计所有可能的出栈序列。
- 当所有的入栈序列已经全部入栈后,则只能出栈
- 当栈为空时,只能进栈
- 当仍有入栈元素且栈不为空时,可以入栈,也可以出栈
入栈 -> 递归处理下一个入栈元素 -> 恢复未入栈状态
出栈 -> 将出栈元素添加到出栈序列 -> 递归处理当前入栈元素 -> 恢复栈和出栈序列上一个的状态
#include <iostream>#include <stack>#include <vector>#include <algorithm>using namespace std;// input: 输入序列,i 表示输入到第 i 个,N 表示有 N 个输入元素; seq: 某一个输出序列; result : 存储所有的序列void GetAllSequence(const int* input, int i, const int N, stack<int> &stk, vector<int> &seq,vector<vector<int> > &result) { if (i == N) { // 输入序列全部入栈完毕,只能出栈。将栈中的元素添加到seq 的后面, 保存 seq if (!stk.empty()) { int top = stk.top(); seq.push_back(top); stk.pop(); GetAllSequence(input, i, N, stk, seq, result); // 保持 i == N,递归地将 stk 元素复制到 seq stk.push(top); //回溯 seq.pop_back(); } else { result.push_back(seq); // 保存结果 } } else { // 对于一个输入元素,可以入栈;可以不入,弹出栈中已有元素 // 入栈 stk.push(input[i]); GetAllSequence(input, i+1, N, stk, seq, result); // 向 i+1 递归 stk.pop(); // 回溯,恢复栈之前的状态 // 出栈 if (!stk.empty()) { int top = stk.top(); //记录 stk.pop(); seq.push_back(top); GetAllSequence(input, i, N, stk, seq, result); // 保持 i 不变 seq.pop_back(); // 回溯,恢复栈和序列之前的状态 stk.push(top); } }}int main(){ int input[] = {1,2,3}; // 输入序列 const int N = sizeof(input)/sizeof(input[0]); vector<vector<int> > result; //保存所有序列 vector<int> seq; stack<int> stk; GetAllSequence(input, 0, N, stk, seq, result); for (int i = 0; i < result.size(); i++) { for (int j = 0; j < result[0].size(); j++) { cout << result[i][j] << " "; } cout << endl; }}
0 0
- 生成所有的出栈序列 (回溯法)
- 回溯法-出栈序列统计
- 求所有的出栈序列
- 序列所有可能的出栈顺序
- 入栈序列的所有出栈序列
- 词典序法生成出栈序列
- 给一串数字,输出所有的出栈序列
- 卡特兰数(Catalan)应用:输出所有N对合法括号序列和输出所有已知进栈序列的合法出栈序列
- 给定一个入栈序列,求所有可能的出栈序列
- 给定一个入栈序列,求所有可能的出栈序列
- 对于一个入栈序列输出所有的出栈序列
- 给定一个入栈序列,求所有可能的出栈序列
- 给定入栈序列1到n,输出所有可能的出栈序列
- 打印所有出栈序列(指定进栈序列的顺序)
- 经典:求指定入栈顺序序列对应的所有可能出栈序列
- C语言算法—生成数集的所有子集(类似建立树的回溯法)
- 回溯---数组序列中所有和为S的组合
- 所有可能的出栈序列问题及卡塔兰数的应用
- 周赛一 ACdream 1196 模拟题
- 为别人撑伞(深度好文)
- HDU 3478
- 第一章 绪论
- JS将一个十进制转换成二进制
- 生成所有的出栈序列 (回溯法)
- myql5.7.7优化配置参数
- Leetcode Exercise
- 给dubbo接口添加白名单——dubbo Filter的使用
- Android网络编程
- 排序算法之快速排序
- 线段树 csu1555 Inversion Sequence
- Axsure中变量的使用
- 周赛一 ACdream 1204 模拟