1.题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
2.算法描述
pushA是栈的入栈序列。
pushB是栈的出栈序列。
如果看pushB是不是一个合理的出栈序列?
可以模拟栈的压入和弹出过程:
1.申请一个辅助栈stack用来对pushA序列压入;并用一个指针idx初始化为0,指示pushB的第一个元素。
2.遍历pushA中的所有元素,并将pushA中元素压入辅助栈stack中,每压入一个pushA中的元素,
检
查
s
t
a
c
k
栈
顶
元
素
和
i
d
x
指
向
p
u
s
h
B
中
的
元
素
是
否
相
同
\red{检查stack栈顶元素和idx指向pushB中的元素是否相同}
检查stack栈顶元素和idx指向pushB中的元素是否相同,如果相同,则需要弹出栈顶的元素,idx后移,直到栈顶元素与pushB元素不等。
3.当遍历完pushA中所有元素之后,
检
查
辅
助
栈
是
否
为
空
,
为
空
则
说
明
p
u
s
h
B
是
合
理
的
弹
出
序
列
,
反
之
则
不
是
\red{检查辅助栈是否为空,为空则说明pushB是合理的弹出序列,反之则不是}
检查辅助栈是否为空,为空则说明pushB是合理的弹出序列,反之则不是。
例如:
pushA入栈序列:1, 2, 3, 4, 5
pushB出栈序列:4, 5, 3, 2, 1
首先1入辅助栈,
此时栈顶1≠4,继续入栈2
此时栈顶2≠4,继续入栈3
此时栈顶3≠4,继续入栈4
此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3
此时栈顶3≠5,继续入栈5
此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3
….
依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。
3.代码描述
3.1.Java代码
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> stack = new Stack<>();
int len = pushA.length, idx = 0;
for(int i=0;i<len;i++){
stack.push(pushA[i]);
while(!stack.isEmpty() && stack.peek() == popA[idx]){
stack.pop();
idx++;
}
}
return stack.isEmpty();
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
stack = []
idx = 0
for e in pushV:
stack.append(e)
while stack and stack[-1] == popV[idx]:
stack.pop()
idx += 1
return not stack