zoukankan      html  css  js  c++  java
  • 记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关键字修饰,保证在多线程的情况下不会有线程安全问题的发生

  • 相关阅读:
    转:Nginx 日志文件切割
    nginx日志切割
    nginx日志配置
    Mongodb数据更新命令
    Android开发书籍推荐
    全面解读python web 程序的9种部署方式
    PowerDesinger15设置字体大小
    A* Pathfinding Project (Unity A*寻路插件) 使用教程
    jQuery的DOM操作之捕获和设置
    如何写一个好的方法
  • 原文地址:https://www.cnblogs.com/yedan/p/15344103.html
Copyright © 2011-2022 走看看