Q22:栈的压入、弹出序列

Q:给定一个入栈序列in和出栈序列out,判断out是否是in的一个可行(合法)的出栈序列。

思路:将入栈序列in入栈,若当前栈顶的元素与当前out的元素相同,那么继续判断out的下一个元素。

            若当前栈顶的元素与当前out的元素不同,且还有未入栈的in元素,那么继续入栈新元素,否则

            就表明,所有的入栈in元素都入栈了,该出栈的元素就是没在栈顶出现,说明被“埋没”了,是个错误的出栈顺序。

bool IsPopOrdder(const int *pPush, const int *pPop, int nlength)
{
	stack<int> stackData;
	bool bPossible = false;
	const int maxvalue = 0x7fffffff;
	stackData.push(maxvalue);
	const int *pcPop = pPop;
	const int *pcPush = pPush;
	if(NULL != pcPop && NULL != pcPush && nlength > 0)
	{
		while (1)
		{
			//相同,则pop
			if(stackData.top() == *pcPop)
			{
				stackData.pop();
				++pcPop;
			}
			//否则判断下一个入栈的值的情况,这里会有两种情况:
			//1)没有元素可以入栈,那么就停止。
			else if(pcPush - pPush == nlength)
				break;
			//2)有元素可以入栈,就继续
			else
			{
				stackData.push(*pcPush);
				++pcPush;
			}
		}
		//表示该入栈的都入了,判断该出的是否都出了。
		if(stackData.top() == maxvalue)
			bPossible = true;
	}
	return bPossible;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值