判断可能出栈顺序--动态规划解法

先给定一个进栈序列(如1,2,3,4,5),可以随意弹栈(如在3进栈之前,2就可能已经进栈然后出栈了)

然后给定一个序列如5,4,3,2,1和3,4,5,1,2,判断是不是其弹栈序列。

我是用动态规划强行弄出来的,弄出来后查质料得知这是一个卡特兰数问题。。。。

思路:

例子4,3,5,1,2

一旦一个数弹栈了比如上面序列中的4,在它进栈之前又在它后面出栈的元素,如1,2,3在它之前进栈,同时又在它后面出栈的序列(3,1,2)

如果这个序列不是和他们进栈的顺序相反的,那么就不是栈的可能出栈顺序。

实现如下

bool Check(int *index,int *ipt,int length)
{
	bool inverse=false;  //记录是否有逆序数
	int max=index[ipt[length-1]]; //max记录已经扫描的序列中最大元素
	int min=max;		      //min记录已经出现的元素中按降序出现的最大元素		
	int lastinv=min;	     //如4,5,3,2 max=5,min=4	
	for(int i=length-2;i>0;i--)		
	{
		if(index[ipt[i]]>max)
		{
			if(max!=index[ipt[i+1]])  //特殊情况,出现新的最大数,那么最大不是在之前的话则不是
				return false;
			else
				max=index[ipt[i]];
		}
		
		else if(index[ipt[i]]>min&&index[ipt[i]]<max)
		{
			if(inverse&&index[ipt[i]]>lastinv)   //如果有逆序数,且比最小的逆序数大
				return false;
			min=index[ipt[i]];
			continue;
		}
		else if(index[ipt[i]]<min)
		{
			if(inverse&&index[ipt[i]]>lastinv)   //如果有逆序数,且比最小的逆序数大
				return false;
			if(!inverse)			//记录是否有逆序数
				inverse=true;
			lastinv=min;			//始终记录最小的逆序数
			min=index[ipt[i]];

		}
		else if(inverse) 
			if(index[ipt[i]]>lastinv&&index[ipt[i]]<max)
				return false;

	}
	return true;
}

运行结果:    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值