题目:
已知某一个字母序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序
示例:
输入abc
输出abc、acb、bac、bca、cba
代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using std::cout;
using std::endl;
using std::stack;
using std::string;
using std::vector;
vector<string> ret;
string path;//就是一种组合
stack<char> st;
int pos = 0;
/*dfs能够完成*/
void dfs(std::string& in) {
if (in.size() == path.size()) {
ret.push_back(path);
return;
}
if (!st.empty()) {
path.push_back(st.top());
st.pop();
dfs(in);
st.push(path.back());
path.pop_back();
}
if (pos < in.size()) {
st.push(in[pos++]);
dfs(in);
st.pop();
--pos;
}
}
int main(){
string str;
std::cin >> str;
dfs(str);
for (auto& e : ret) {
cout << e << endl;
}
return 0;
}
效果:
总结:
栈结构的特点是先进后出。
1、当一个数据入栈之后就有两种情况,出栈或者不出栈。
2、每当一个数据入栈之后就要立马考虑出栈,故须进入dfs。进行回溯(恢复现场)就是不出栈的情况。
3、当每向栈中压入一个数据的时候,也是数据入栈情况,也需进入dfs。进行回溯的时候则是为了dfs函数结束的。ps:dfs中第二个if中的条件是栈不为空。进行回溯,也就是清空栈。
参考如下决策树,