序列入栈后所有可能的出栈数目及顺序(递归)

本文通过递归算法探讨了序列出入栈的所有可能顺序,并利用卡特兰数理论进行了解释。通过具体的代码实现展示了如何计算不同序列的出栈顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以一个序列(不重复)入栈可能的出栈顺序可以通过计算对于的卡特兰数获得。
另一种形式是

感兴趣的话可以去组合数学里看推导过程,在此就不讨论其证明过程


当我们模拟入栈 出栈是会发现,以一个序列入栈的除第一个元素必须入栈外,其他时候面临着出栈栈顶元素或将当前序列数入栈两种情况

简化为递归过程就是
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;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值