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


- 如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。
- 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。
- 如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
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;
std::stack<int> stackData;
while (pNextPop - pPop < nLength)
{
// 当辅助栈的栈顶元素不是要弹出的元素
// 先压入一些数字入栈
while (stackData.empty() || stackData.top() != *pNextPop)
{
// 如果所有数字都压入辅助栈了,退出循环
if (pNextPush - pPush == nLength)
break;
stackData.push(*pNextPush);
pNextPush++;
}
if (stackData.top() != *pNextPop)
break;
stackData.pop();
pNextPop++;
}
if (stackData.empty() && pNextPop - pPop == nLength)
bPossible = true;
}
return bPossible;
}
C++ 题解
class Solution {
public:
bool isPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size() != popV.size() || pushV.size() < 0)
return false;
// 创建一个辅助栈
stack<int> data;
int Index = 0;
for(int i=0;i<pushV.size();i++)
{
// 入栈序列中每个元素入栈
data.push(pushV[i]);
// 出栈的条件是辅助栈栈顶元素与当前的出栈序列的最前面的元素相等
while(!data.empty() && data.top() == popV[Index])
{
data.pop();
Index++;
}
}
return data.empty();
}
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
if len(pushV) < 0 or len(pushV) != len(popV):
return False
alist = []
index = 0
for i in range(len(pushV)):
alist.append(pushV[i])
while alist and (alist[-1] == popV[index]):
alist.pop()
index += 1
return len(alist) == 0

浙公网安备 33010602011771号