面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列4、5、3、2、1 是该压栈序列对应的一个弹出序列,但 4、3、5、1、2 就不可能是该压栈序列的弹出序列。
压栈序列为1、2、3、4、5,弹出序列4、5、3、2、1对应的压栈和弹出过程
一个压入顺序为1、2、3、4、5的栈没有一个弹出序列为4、3、5、1、2
规律:
如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
代码如下:
#include <iostream>
#include <stack>
using namespace std;bool IsPopOrder(const int *pPush, const int *pPop, int nLength)
{bool bPossible = false;if (pPush != nullptr && pPop != nullptr && nLength > 0){const int *pNextPush = pPush;const int *pNextPop = pPop;stack<int>stackDate;while (pNextPop - pPop < nLength){while (stackDate.empty() || stackDate.top() != *pNextPop){if (pNextPush - pPush == nLength) break;stackDate.push(*pNextPush);pNextPush++;}if (stackDate.top() != *pNextPop) break;stackDate.pop();pNextPop++;}if (stackDate.empty() && pNextPop - pPop == nLength) bPossible = true;}return bPossible;
}
测试用例:
● 功能测试(输入的两个数组含有多个数字或者只有 1 个数字,第二个数组是或者不是第一个数组表示的压入序列对应的栈的弹出序列)。
● 特殊输入测试(输入两个NULL指针)。
本题考点:
● 考查分析复杂问题的能力。刚听到这个面试题的时候,很多人可能都没有思路。这个时候,可以通过举一两个例子,一步步分析压栈、弹出的过程,从中找出规律。
● 考查应聘者对栈的理解。