题目:
已知某一个字母序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序
示例:
输入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,是因为栈操作大多都是单数据操作。