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;
    }
}
posted @ 2025-05-22 10:00  回忆、少年  阅读(7)  评论(0)    收藏  举报