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;
}