题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列【1、2、3、4、5】是某栈的压入顺序,序列【4、5、3、2、1】是该压栈序列对应的一个弹出序列,但【4、3、5、1、2】就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
用一个辅助栈,按照入栈的顺序,向辅助栈中添加元素,如果栈顶与出栈元素相同,则出栈。最后判断辅助栈是否为空即可。
如图所示,最后栈为空,说明【4、5、3、2、1】是【1、2、3、4、5】的出栈顺序。
java 代码:
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA, int [] popA) {
int pushLen = pushA.length;
int popLen = popA.length;
if( pushLen != popLen || pushLen == 0) {
return false;
}
Stack<Integer> _stack = new Stack<>();
int index = 0;
for(int i = 0; i < pushLen; i++) {
_stack.push(pushA[i]);
while(!_stack.empty() && _stack.peek() == popA[index]) {
_stack.pop();
index++;
}
}
return _stack.empty();
}
}
python代码:
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
stack = []
if len(pushV) != len(popV) or len(pushV) == 0:
return False
index = 0
for i in pushV:
stack.append(i)
while len(stack) > 0 and stack[-1] == popV[index]:
stack.pop()
index += 1
return len(stack) == 0