30.栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。
注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。
数据范围:
序列长度 [0,1000]。
样例:
输入:[1,2,3,4,5]
[4,5,3,2,1]
输出:true
代码:
class Solution {
public boolean isPopOrder(int [] pushV,int [] popV) {
//如果两个序列都为空,则是合法的弹出顺序
if(pushV.length == 0 && popV.length == 0)return true;
//如果两个序列长度不同,肯定不是合法的弹出顺序
if(pushV.length != popV.length)return false;
//使用双端队列模拟栈
Deque<Integer> s = new LinkedList<>();
int n = popV.length;
//遍历push序列
for(int i = 0,j = 0;i<n;i++){
//将当前元素压入栈
s.push(pushV[i]);
//检查栈顶元素是否等于pop序列的当前元素
while(!s.isEmpty() && s.peek() == popV[j]){
//如果等于,则弹出栈顶元素,并移动到pop序列的下一个元素
s.pop();
j++;
}
}
//如果栈为空,则说明所有元素都按popV的顺序弹出了
//如果不为空,说明popV不是合法的弹出顺序
if(s.isEmpty())return true;
return false;
}
}

浙公网安备 33010602011771号