Leetcode第946题

题目描述

https://leetcode.cn/problems/validate-stack-sequences/

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

个人思路

不会使用Java的栈数据,然后模拟了一下出入栈的过程,栈序列第一个元素只能与栈顶元素或未放入元素相同时,才能输出。输出之后,栈顶下滑,继续刚才的操作,直到popped了length个元素。

class Solution{
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        int count=0;
        for (int i=0;i<pushed.length;i++){
            if (find(pushed,i,popped,0,count))return true;
        }
        return false;
    }

    public boolean find(int[] pushed,int i,int[] popped,int j,int count){
        if (count==pushed.length)return true;
        while (pushed[i]==-1 && i>0)i--;
        for(;i<pushed.length;i++){
            if (pushed[i]==popped[j]){
                pushed[i]=-1;
                count++;
                if(find(pushed,Math.abs(i-1),popped,j+1,count))return true;
            }
        }
        return false;
    }
}

代码优化

参考思路

直接辅助的堆栈结构,用现成的方法实现出入栈,如果最后栈里还有元素,说明按照指定序列不能出栈,避免递归。

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque<Integer> stack = new ArrayDeque<>();
        int j = 0; 
        for (int i = 0; i < pushed.length; i++) {
            stack.push(pushed[i]);
            while (!stack.isEmpty() && stack.peek() == popped[j]) {
                j++;
                stack.pop();
            }
        }
        return stack.isEmpty();
    }
}

收获

JAVA的数据结构Stack的用法