ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode栈&队列

2022-07-16 14:02:06  阅读:151  来源: 互联网

标签:deque return 括号 队列 Leetcode int push public


Leetcode栈&队列

232.用栈实现队列


题干:LE5QYj.png


思路:

  • 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性。
  • 具体实现方法可以理解为,准备两个栈,一个栈用作输入栈,入数据就存数据,一个栈用作输出栈,出数据就入数据再弹数据。
  • LEIOr6.jpg

代码:

class MyQueue {
    /**
     * 先声明变量,留在MyQueue方法中进行Init
     */
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn=new Stack<Integer>();
        stackOut=new Stack<Integer>();
    }

    public void push(int x) {
        stackIn.push(x);
    }

    public int pop() {
        dumpStackIn();
        return stackOut.pop();
    }

    public int peek() {
        dumpStackIn();
        return stackOut.peek();
    }

    public boolean empty() {
        //不难得出,当输入输出栈均为空时,队列就是空的
        return stackOut.isEmpty()&&stackIn.isEmpty();
    }

    private void dumpStackIn(){
        if(!stackOut.isEmpty()){
            return;
        }
        while (!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

20.有效的括号


题干:

LEoxO0.png

思路:

  • 这种匹配类的题目都可以用栈来解决。当某组括号的左括号被扫描到时,我们就将与它配对的括号入栈(它本身也可以,但是存入配对的括号在后续步骤中可以通过判断是否相同来加快速度),之后遇到相同的括号就将其出栈。
  • 第一种情况:扫描完毕,栈同时也是空的。对应着有效的字符串
  • 第二种情况:扫描未完毕,栈已经空了。对应着左括号数量少于右括号,不符合要求
  • 第三种情况:扫描完毕,栈未空,说明左括号数量大于右括号,不符合要求
  • 第四种情况:扫描未完毕,发现栈顶元素与当前括号类型不匹配,不符合要求

代码:

class Solution {
    public boolean isValid(String s) {
        //这里使用双向链表deque来模拟栈
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            if (ch == '(') {
                deque.push(')');
            }else if (ch == '{') {
                deque.push('}');
            }else if (ch == '[') {
                deque.push(']');
            } else if (deque.isEmpty() || deque.peek() != ch) {
                return false;
            }else {
                deque.pop();
            }
        }
        return deque.isEmpty();
    }
}

1047.删除字符串中的所有相邻重复项


题干:

LE7iHf.png

思路:

  • 有效的括号有着异曲同工之妙,我们依次扫描传入的字符串,并判断栈顶元素是否与当前扫描到的字符相同,如果相同,则出栈此元素,扫描完毕后,将栈中元素弹出逆序即可。
  • 在这题中,我们将频繁使用到删除这个操作,根据数据结构的知识,这种情况下采用Array结构将比LinkedList结构快一些

代码:

class Solution {
    public String removeDuplicates(String s) {
        Deque<Character> deque=new LinkedList<>();
        char letter;
        for(int i=0;i<s.length();i++){
            letter=s.charAt(i);
            if(deque.isEmpty()||deque.peek()!=letter){
                deque.push(letter);
            }else{
                deque.pop();
            }
        }
        String ans="";
        while (!deque.isEmpty()){
            //每次将上一次的ans放到末尾,就可以起到reverse的作用了
            ans=deque.pop()+ans;
        }
        return ans;
    }
}

Tips:

  • 写的时候将deque.pop()写成了deque.add(),查询代码以后发现了两者的区别
  • LEjYoq.png
  • LVpWsU.png
  • 首先是返回值不同,push的返回值为void,add的返回值为Boolean;其次是位置不同,push插入头,add插入尾

150.逆波兰表达式求值


题干:LV9CWt.png

Tips:

  • 表达式有前缀、中缀、后缀,其中前缀表达式称为波兰表达式,这也就是为什么后缀表达式叫逆波兰表达式,中缀表达式就是人们日常运算时所书写的形式,例如1+1+1+1=4这种。分类标准就是依据将运算符号放置在运算数前、中还是后。

思路:

  • 读《算法》第四版的时候,书中的经典例题,没遇到运算符之前就入栈,遇到运算符就将运算符出栈,并同时出栈两个数字,进行与对应的出栈的运算符的运算操作,并最后将运算结果压入栈中。
  • 需要注意的是,在进行减法与除法这类需要考虑顺序的运算时,不要直接就大意的认为将出栈的两个数字相减或是相除就行了。

代码:

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> stack=new LinkedList<Integer>();
        for(int i=0;i<tokens.length;i++){
            if("+".equals(tokens[i])){
                stack.push(stack.pop()+stack.pop());
            }else if("-".equals(tokens[i])){
                stack.push(-stack.pop()+stack.pop());
            }else if("*".equals(tokens[i])){
                stack.push(stack.pop()*stack.pop());
            }else if("/".equals(tokens[i])){
                int temp1=stack.pop();
                int temp2=stack.pop();
                stack.push(temp2/temp1);
            }else{
                stack.push(Integer.valueOf(tokens[i]));
            }
        }
        return stack.pop();
    }
}

347.前K个高频元素


题干:LVFqbT.png

思路:

  • 第一个想法是利用哈希表存入数字与其出现的次数,排序之后取最前的K个value对应的key就可以了。

代码:

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        int[] ans=new int[k];
        Map<Integer,Integer> map=new HashMap();
        for(int i:nums){
            if(map.containsKey(i)){
                map.put(i,map.get(i)+1);
            }else {
                map.put(i,1);
            }
        }
        int max=0;
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            if(entry.getValue()>max){
                max=entry.getValue();
            }
        }

        while (k>0){
            for(Map.Entry<Integer,Integer> entry:map.entrySet()){
                if(entry.getValue()==max){
                    ans[k-1]=entry.getKey();
                    k--;
                }
            }
            max--;
        }
        return ans;
    }
}

Tips:

  • 在Hashmap中,每一个Key-Value被看作是一个set集合。

  • 为了更便捷的获取Key-Value,使用Entry来进行编写,for-each循环中用entrySet把每一个键值对取出进行遍历。

标签:deque,return,括号,队列,Leetcode,int,push,public
来源: https://www.cnblogs.com/appletree24/p/16484043.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有