数据结构-栈-入栈顺序有多少种可能出栈结果

做题看到有这么一题很有意思,记录一下

第二个问题只要把字母放在前面然后进行穷举就行了,第一个问题有些困扰

方法一 穷举法

A.  1个元素入栈出栈一种可能记作f(1) = 1;

B.  2个元素入栈出栈有两种可能记f(2) = 2;

C. 3个元素入栈,考虑最后一个元素,出栈为第一个位置1种,第二个位置2种,第三个位置f(2)种,记作f(3) = 5;

D. 4个元素入栈,考虑最后一个元素,出栈为第一个位置1种,第二个位置(前面只有一个元素pop出去了,在3个push任意位置插入一个pop)有3种可能,第三个位置(说明已经pop出去两个元素,考虑1-3三个数,pop其中两个,若两个连续有前面f(2)种,不连续只有一种,即num_pop(1,2) = 2,num_pop(2,3)=2,num_pop(1,3)=1)有共5种可能,第四个位置pop即为前面f(3)的值,即f(4) = 1 + 3 + 5 + 5 = 14种。

E. 5个元素入栈,考虑最后一个元素,出栈为第一个位置1种,第二个位置(前面有4个元素选择一个pop)有4种可能,第三个位置(说明已有两个元素pop出去,若为pop的为1,2有2种,1,3有一种,1,4有1种,若pop的为2,3有2种,pop2,4有1种,pop3,4有2种)共计9种,第四个位置(说明已经pop出去三个元素,那么假设1未被pop,有f(3)种,2未被pop有f(2)种,3未被pop有f(2)种,4未被pop有f(3)种)共14种,第五个位置即f(4),因此f(5) = 1 + 4 + 9 + 14 + 14 = 42种。
 

 方法二 卡特兰数

卡特兰数_百度百科

方法三 利用代码 

#include <iostream>
#include <algorithm>
#include <conio.h>
using namespace std;
int testify(int *a,int len)
{
	int num0 = 0;
	int num1 = 0;
	for(int i=0;i<len;++i)
	{
		if(a[i] == 1)
			++num1;
		else
			++num0;
		if(num0 > num1)
			return 0;		
	}
	return 1;
}
int main()
{
	int m[10] = {0,0,0,0,0,1,1,1,1,1};
	int count = 0;
	do{
		if(testify(m,10))
			++count;
	}while(next_permutation(m,m+10));
	cout<<"Total NO:"<<count<<endl;
	getch();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值