以一个序列(不重复)入栈可能的出栈顺序可以通过计算对于的卡特兰数获得。
另一种形式是
感兴趣的话可以去组合数学里看推导过程,在此就不讨论其证明过程
当我们模拟入栈 出栈是会发现,以一个序列入栈的除第一个元素必须入栈外,其他时候面临着出栈栈顶元素或将当前序列数入栈两种情况
简化为递归过程就是
if(输入序列为空,即“入栈结束”){如果此时栈为还有元素就pop至空}//递归边界
else{
//“入栈”过程还没结束
序列元素入栈
递归
出栈栈顶元素
递归
}//也就是上面所说的两种选择
//以下是代码
#include<iostream>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<fstream>
#include<algorithm>
using namespace std;
int num = 0;
void findAll(queue<int>in,stack<int>s,queue<int>out){//输入序列列表,暂存栈,输出列表
if(in.empty()){
num++;
while(!out.empty()){
cout<<out.front()<<" ";
out.pop();
}
while(!s.empty()){//反正也是要加到out序列的后面,因此可以直接输出
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
return;
}
else {//输入序列不为空
if(!s.empty()){//在栈不为空的情况下,考虑栈顶元素出栈的情况
out.push(s.top());
s.pop();
findAll(in,s,out);
//恢复现场
out.pop();
s.push(out.back());
}
//元素入栈情况
s.push(in.front());
in.pop();
findAll(in,s,out);
}
}
int main(){
queue<int>in;
for(int i=1;i<=5;i++)in.push(i);
stack<int>s;
queue<int>s2;
findAll(in,s,s2);
cout<<num;
return 0;
}