剑指offer刷题————栈的压入、弹出序列

1.问题重述

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是压栈序列的弹出序列

2.思路解析

这道题目的思路很明确,我们就建立一个栈,然后让入栈序列先入栈一个,然后看栈顶元素是否与弹出序列的第一个元素相等,如果相等,弹出序列,并且将弹出序列向后遍历一位。如果不相等,继续将入栈序列入栈。如果入栈结束后,发现在弹出序列没有遍历完的同时(这时栈不为空),栈顶元素不等于弹出序列遍历到位置的元素,就可以认为不满足条件。

3.代码实现

//在函数进行之前可以判断两个序列是否等长,如果不等长,那么肯定不是弹出序列
bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
	assert(pPush != NULL && pPop != NULL && nLength > 0);
	//两个迭代器
	int i = 0;
	int j = 0;
	stack<int> data;
	while (i < nLength || j < nLength)
	{
	
		//如果满足下面条件,入栈序列遍历完,弹出序列肯定没遍历完
		//因为i==nLength,所以j<nLength
		//这时如果栈顶元素和pPop[j]不相等的话,就不会满足条件了
		//注意:不可能出现栈为空,弹出序列没有遍历完的情况,因为默认两个序列是等长的
		if (!data.empty() && data.top() != pPop[j] && i == nLength)
			return false;
		if (!data.empty() && data.top() == pPop[j])
		{
			data.pop(); 
			if (j < nLength)
				++j;
			//要跳出本次循环,因为出栈之后栈顶元素可能和弹出序列的下一个值相等
			continue;
		}
		data.push(pPush[i]);
		if (i < nLength)
			++i;
	}
	return true;
}
发布了143 篇原创文章 · 获赞 35 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42214953/article/details/105574010
今日推荐