「数据结构」栈:题解

个人主页:Ice_Sugar_7
所属专栏:Java数据结构
欢迎点赞收藏加关注哦!

  • 简介
  • 栈的常用方法
  • 栈的应用
    • 逆波兰表达式求值
    • 出栈入栈顺序匹配
    • 最小栈问题

简介

栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素操作

概念区分

栈、虚拟机栈、栈帧有什么区别?

  • 栈是一种数据结构
  • 虚拟机栈是JVM划分的一块内存
  • 栈帧是调用方法时,在虚拟机中给这个方法开辟的一块内存

因为它的结构比较简单,所以本文中我们就不专门去实现它了,直接刷题吧!

栈的常用方法

方法 功能
Stack() 创建一个空的栈
E push(E e) 将e入栈,并返回e
E pop() 将栈顶元素出栈并返回
E peek() 获取栈顶元素
int size() 获取栈中有效元素个数
boolean empty() 检测栈是否为空

栈的应用

逆波兰表达式求值

题目链接

思路:遍历字符串数组,如果遇到数字字符,就把它转换为整型,然后入栈;如果遇到运算符,那就从栈中取出两个数字,将它们进行相应的运算,运算结果入栈
遍历完之后,栈中只剩下一个元素,它就是表达式的值

class Solution {
    Stack<Integer> stack = new Stack<>();  //存放数字

    public int evalRPN(String[] tokens) {
        for(String str:tokens) {
            if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) {
                int num2 = stack.pop();
                int num1 = stack.pop();
                switch (str) {
                    case "+":
                        stack.push(num1+num2);
                        break;
                    case "-":
                        stack.push(num1-num2);
                        break;
                    case "*":
                        stack.push(num1*num2);
                        break;
                    case "/":
                        stack.push(num1/num2);
                        break;
                }
            } else {
                stack.push(Integer.parseInt(str));
            }
        }
        return stack.peek();
    }
}

涉及到的知识点

  • 字符串比较内容是否相同
  • 将字符串转为整型

出栈入栈顺序匹配

题目链接

思路:

  1. 建一个栈stack,遍历入栈数组,将里面的元素入栈。定义一个变量j,初始化为0,表示出栈数组的下标
  2. 每入一个元素,就将它和出栈数组的元素进行比较,如果相等,那就出栈,然后 j++。这个比较的过程可能有多次,所以我们写成一个while循环
  3. 如果出入栈顺序匹配,那最终栈就为空,反之则不为空
class Solution {
    Stack<Integer> stack = new Stack<>();

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

最小栈问题

题目链接

思路:用两个栈来实现这个“最小栈”:普通栈stack和存储stack当前最小值的minstack
下面解释一下minstack的运转机制:

  1. 将一个元素a入栈stack时,把a和minstack栈顶元素b作比较(如果minstack为空,那就直接让a入minstack)
  2. 如果a < b,那就让a入minstack;反之则不用入

通过这两步,我们就能确保minstack的栈顶元素永远是stack当前元素中的最小值

class MinStack {
    public Stack<Integer> stack = new Stack<>();
    public Stack<Integer> minstack = new Stack<>();

    public MinStack() {
        
    }

    public void push(int val) {
        stack.push(val);
        if(minstack.isEmpty()) {
            minstack.push(val);
        } else {
            int top = minstack.peek(); //取minstack栈顶值与val比较
            //注意这里要取到等号
            if(val <= top) {
                minstack.push(val);
            }
        }
    }

    public void pop() {

        if(stack.isEmpty()) {
            return;
        }
        //出stack,比较出栈的值是否和minstack栈顶值相等,若相等,那minstack也要出栈
        int pop = stack.pop();
        if(pop == minstack.peek()) {
            minstack.pop();
        }
    }

    public int top() {
        if(stack.isEmpty()) {
            return -1;
        } else {
            return stack.peek();
        }
    }

    public int getMin() {
        if(minstack.isEmpty()) {
            return -1;
        } else {
            return minstack.peek();
        }
    }
}

你可能感兴趣的:(Java数据结构,数据结构,java,开发语言)