栈、队列、优先队列

image.png

题目1:由于只包含字符的字符串'(',')','{','}','['和']',确定输入字符串是有效的。
原题:https://leetcode.com/problems/valid-parentheses/

 public static void main(String[] args) {
        System.out.println(validate("([{}])"));//true
        System.out.println(validate("]()["));//false
        System.out.println(validate("(()"));//false
    }

    public static boolean validate(String a){
        Map map = new HashMap<>();//定一个map,用右边的括号做key,巧妙来判断
        map.put(")","(");
        map.put("]","[");
        map.put("}","{");

        Stack stock = new Stack<>();

        for(char c : a.toCharArray()){
            if(!map.containsKey(String.valueOf(c))){//如果不在所有都key当中,说明是左括号,直接放入栈,比如是( [ { ,合法的
                stock.push(c);
            }else if(stock.isEmpty()){//如果栈为空,代表第一次的if没有进去,说明是右括号,直接不合法,比如) ] }
                return false;
            }else {
                String s = map.get(String.valueOf(c));
                Object pop = stock.pop();
                System.out.println(s + "=" + pop);
                if (!s.equals(pop.toString())) {//从栈顶取出一个,与本次右括号对应的左括号相比,如果不相等,代表不合法,比如 栈顶的值是[,本次右括号是)
                    return false;
                }
            }
            //其中第二个elseif和第三个else 可以合并到一个else if语句
        }
        return stock.isEmpty();//如果栈为空,代表合法
    }

题目2:如何用栈来实现队列都效果 题目序号:232 225
原题:https://leetcode.com/problems/implement-queue-using-stacks/

比如栈存入 1 -> 2 -> 3 进去,要按 1 -> 2 -> 3 出来
思路可以是用两个栈,第一个栈依次push数据,第二个栈push第一个栈pop的数据,这样取数据都时候直接从第二个栈取数据,相当于队列都先入先出效果了,如果第二个栈没读取完,又来了新数据 4、5、6,第一个栈还是老样子依次push数据,但是要等第二个栈pop完成(第二个栈为空时)才再次push第一个栈pop的数据

优先队列

Java我们一般用mini heap和max heap 实现


image.png

image.png

题目3:设计一个类来查找流中第k个最大元素。请注意,它是排序顺序中的第k个最大元素,而不是第k个不同元素
原题:https://leetcode.com/problems/kth-largest-element-in-a-stream/
思路,使用优先队列的方式,我们考虑用最小堆(min heep)这个数据结构解决,它的特点是最小值放在上面

class Wei {
    int k;
    PriorityQueue minheap;
    public Wei(int k, int[] nums) {
        minheap = new PriorityQueue<>(k);
        this.k = k;
        for(int num: nums) {
            minheap.offer(num);
            if(minheap.size() > k) {
                minheap.poll();//把最小的去掉,只保留k个数
            }
        }
    }

    public int add(int val) {
        if(minheap.size() < k){//如果堆的数据不足k个,直接insert
            minheap.offer(val);
        }else if(minheap.peek() < val) {//如果读取出来(这里只是读取,没有remove)的最小值<当前值,把原来的最小值poll,放入当前这个值
            minheap.poll();
            minheap.offer(val);
        }
        return minheap.peek();
    }

    public static void main(String[] args) {
        int [] nums = {1,2,4,6,8};
        Wei item = new Wei(3,nums);
        System.out.println(item.minheap);
        System.out.println(item.add(5));
        System.out.println(item.minheap);
        System.out.println(item.add(10));
        System.out.println(item.minheap);
    }
}

你可能感兴趣的:(栈、队列、优先队列)