leetcode刷题-20200602-medium-面试题31. 栈的压入、弹出序列

声明:
作者不是什么大佬,只是想写写算法,提高一下自己的内功。所以代码可能会非常凌乱,(大佬们就当个笑话看就可以了),但我会认真注释。


最后如果有路过的大佬,希望可以留下你们的建议和看法,谢谢!

面试题31. 栈的压入、弹出序列

一、原题链接

面试题31. 栈的压入、弹出序列

二、题目介绍

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

三、测试用例

1.示例

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

2.示例

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

四、思路解析

这道题就是单纯考验个人的数据结构的知识掌握情况,如果对栈学习熟悉的话其难度算不上中等。
首先我们拥有两个条件一个是入栈的顺序另一个是出栈的顺序

五、代码

class Solution {
     
    
    public boolean validateStackSequences(int[] pushed, int[] popped) {
     
    Stacks stack = new Stacks(pushed.length);
        int i = 0;
        int k = 0;
        int[] arr = new int[pushed.length];
        while (i < pushed.length) {
     
            if (pushed[i] == popped[k]) {
     
                stack.push(pushed[i]);
                arr[k] = stack.pop();
                k++;
                while (stack.arr[stack.last]!=null &&k < popped.length && popped[k] == stack.arr[stack.last]) {
     
                    arr[k] = stack.pop();
                    k++;
                }
            } else {
     
                stack.push(pushed[i]);
            }
            i++;
        }
        while (stack.last != 0) {
     
            arr[k] = stack.pop();
            k++;
        }
        for (int p = 0; p < arr.length; p++) {
     
            if (arr[p] != popped[p]) {
     
                return false;
            }
        }
        return true;
    }
}

class Stacks {
     
    Integer[] arr;
    Integer last;
    Integer head;

    public Stacks(int n) {
     
        this.arr = new Integer[n + 1];
        last = 0;
        head = 0;
    }

    public boolean isEmpty() {
     
        return last == 0;
    }

    public boolean isFull() {
     
        return (last + 1) == arr.length;
    }

    public void push(int n) {
     
        if (!isFull()) {
     
            last++;
            this.arr[last] = n;
        }
    }

    public Integer pop() {
     
        if (!isEmpty()) {
     
            int temp = arr[last];
            arr[last] = 0;
            last--;
            return temp;
        } else {
     
            return -1;
        }
    }
}

你可能感兴趣的:(算法刷题,算法,数据结构,栈,leetcode,java)