记Stack的用法

在刷leetcode一道简单题的时候借助了栈的用法,发现在日常工作中很少会使用栈,因此复习一遍,以免后续遗忘

  1. 在leetcode中的题目是这样的

    在解答这道题的时候,第一次尝试用了暴力解法,解是解开了,但是实在不美观,于是尝试了一下新的写法,就有了用了stack
点击查看代码
public static boolean isValid(String s) {
        Stack<Integer> stack = new Stack();
        Map<Character, Integer> map = new HashMap<>();
        map.put('[', 1);
        map.put(']', -1);
        map.put('(', 2);
        map.put(')', -2);
        map.put('{', 3);
        map.put('}', -3);
        for (int i = 0; i < s.length(); i++) {
            Integer value = map.get(s.charAt(i));
            if (!stack.empty()) {
                Integer lastValue = stack.pop();
                if (lastValue + value == 0 && lastValue > value) {
                    continue;
                } else {
                    stack.push(lastValue);
                    stack.push(value);
                }
            }else {
                stack.push(value);
            }
        }
        if (stack.empty()) {
            return true;
        }
        return false;
    }
这种解法利用stack的特性,先进后出(FILO),利用最后进的数据永远是最新出去的特性,匹配括号是否是一对,这样就能实现,但是这种写法太过于冗余,自己定义了一个HaskMap去维护这些括号值,于是看leetcode上大神的解法


不得不说,刷题还有很多路要走,都是前面欠下的债/(ㄒoㄒ)/~~

回顾一下stack的特性
Stack是Vector类下面的一个子类,Vector是线程安全的,他除了继承Vetcor所有的方法以外,自己还定义了一些其他的方法

写一个简单的例子

点击查看代码
public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        //压栈
        stack.push(1);
        stack.push(2);
        stack.push(3);
        //查看栈的顶部,但是不弹出
        System.out.println("顶部数据:" + stack.peek());
        //弹出最后一个进栈的数据
        stack.pop();
        //判断栈是否为空
        boolean empty = stack.empty();
        for (int i = 0; i < stack.size(); i++) {
            System.out.println(stack.get(i));
        }
        System.out.println(empty);
    }

因为stack继承了Vector,所以它也是线程安全的,看Stack的源码可以看到,他的Pop方法被synchronized关键字修饰,保证在多线程的情况下不会有线程安全问题的发生

posted @ 2021-09-27 22:33  Kepler(*^_^*)  阅读(118)  评论(0编辑  收藏  举报