模拟出栈的所有顺序(dfs+回溯)

题目:

        已知某一个字母序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序

示例:

        输入abc

        输出abc、acb、bac、bca、cba

代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 
#include 
using std::cout;
using std::endl;

void dfs(std::vector& ret, std::stack& 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 ret;
    std::stack st;
	std::string tmp;
	int i = 0;
	dfs(ret, st, in, tmp, i);
	for (auto e : ret)
		cout << e << ' ';
	return 0;
}

效果:

模拟出栈的所有顺序(dfs+回溯)_第1张图片

总结:

栈结构的特点是先进后出。数据首先是一个一个入栈的,入栈之后进入dfs可能会找到合适的结果,因此需要进行回溯(就是出栈)。当一个数据入栈之后就有两种情况,出栈或者不出栈。 其中,后两个过程都是if,是因为栈操作大多都是单数据操作。

你可能感兴趣的:(刷题,深度优先,算法)