题目:
已知某一个字母序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序
示例:
输入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;
void dfs(std::vector<std::string>& ret, std::stack<char>& st, std::string& in, std::string& tmp, int& i) {
if (tmp.size() == in.size()) {
ret.push_back(tmp);
return;
}
if (!st.empty()) {
tmp.push_back(st.top());
st.pop();//出栈
dfs(ret, st, in, tmp, i);
st.push(tmp.back());//不出栈
tmp.pop_back();
}
if (i < in.size()) {
st.push(in[i++]);
dfs(ret, st, in, tmp, i);
st.pop();
i--;
}
}
int main() {
std::string s;
cin >> s;
std::vector<std::string> ret;
std::stack<char> st;
std::string tmp;
int i = 0;
dfs(ret, st, in, tmp, i);
for (auto e : ret)
cout << e << ' ';
return 0;
}
效果:
总结:
栈结构的特点是先进后出。数据首先是一个一个入栈的,入栈之后进入dfs可能会找到合适的结果,因此需要进行回溯(就是出栈)。当一个数据入栈之后就有两种情况,出栈或者不出栈。 其中,后两个过程都是if,是因为栈操作大多都是单数据操作。