题目概述
输入两个整数的序列,第一个序列表示入栈的顺序,判断第二个序列是否为该栈的弹出顺序
比如1、2、3、4、5 , 序列45321就是该栈序列对应的一个弹出序列,但是43512就不可能是
解决思路
用一个辅助的栈
把输入的第一个序列的数字依次压入栈中,并按照第二个序列的出栈顺序依次出栈
合法序列举例
非法序列举例
代码实现
#include<iostream>
using namespace std;
#include<assert.h>
#include<stack>
//面试题22-栈的压入和弹出序列
bool IsPopOrder(const int* pPush,const int* pPop, size_t length)
{
assert(length);//大于0
assert(pPush && pPop);
bool possible = false;
const int* NextPush = pPush;
const int* NextPop = pPop;
stack<int> s;
while (NextPop - pPop < length)
{
//当栈为空或者栈顶元素不为需要出栈的元素时,入栈
while (s.empty() || s.top() != *NextPop)
{
//如果入栈序列没有元素,break跳出
if (NextPush - pPush == length)
break;
s.push(*NextPush);
NextPush++;
}
if (s.top() != *NextPop)
break;
s.pop();
NextPop++;
}
if (s.empty() && NextPop - pPop == length)
possible = true;
return possible;
}