就是栈的知识点啊 栈是后进先出的
不过感觉这题目好怪啊 栈的知识点 扯个全部出队是干啥
问题回答:对于这个问题只需要得到一个有效的出栈序列即可,不必求解所有出栈序列情况。关于该问题的解题思路,可以采用回溯法。具体实现过程如下:
下面是根据上述思路的代码实现,其中generate()是回溯函数的实现:
#include <stack>
#include <vector>
#include <iostream>
using namespace std;
void generate(int n, vector<int>& out, stack<int>& st, vector<vector<int>>& res) {
// 所有元素都已经处理过一遍,判断栈中元素是否已全部弹出
if (n == 0) {
if (st.empty()) {
res.push_back(out);
}
// 栈中还没有弹出所有元素,直接返回
return;
}
// 把元素压入栈
st.push(n);
generate(n - 1, out, st, res);
st.pop();
// 如果栈顶元素比当前元素小,则不能再继续压入,
// 只能先把后面的元素都压入栈中再弹出
if (!st.empty() && st.top() > n) {
return;
}
// 把元素弹出
out.push_back(n);
generate(n - 1, out, st, res);
out.pop_back();
}
vector<vector<int>> getSequences(int n) {
vector<int> out;
stack<int> st;
vector<vector<int>> res;
generate(n, out, st, res);
return res;
}
int main() {
vector<vector<int>> seqs = getSequences(3);
for (vector<int> seq : seqs) {
for (int elem : seq) {
cout << elem << " ";
}
cout << endl;
}
return 0;
}
运行该代码得到输出结果:
3 2 1
3 1 2
2 3 1
1 3 2
2 1 3
1 2 3
说明求得的所有出栈序列都是有效的。
第一个要求的意思是:将数据1、2、3、4、5按照顺序依次压入栈中,再将它们按照先入后出的顺序依次弹出,输出弹出的序列。
第二个要求的意思是:先将数据3、2、1按照顺序依次压入栈中,并弹出2次。然后再将数据4、5、6、7按照顺序依次压入栈中,再将所有数据按照先入后出的顺序依次弹出,输出每一次入栈和出栈的操作,以及最终的出栈序列。
你要知道: 依次弹出栈中数据的顺序和依次入栈的数据顺序相反(先进后出,后进先出)。