您的位置:首页 > 职场人生

【面试题】剑指Offer-22-栈的压入和弹出序列

2017-03-23 10:34 337 查看

题目概述

输入两个整数的序列,第一个序列表示入栈的顺序,判断第二个序列是否为该栈的弹出顺序

比如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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: