代码随想录-2023/07/08

81 阅读1分钟

栈与队列的应用

20.有效的括号

解题思路:

  1. 用栈模拟, 每当遇到一个右括号时, 就弹出一个左括号
  2. 若弹出的符号与右括号不匹配时, 匹配失败
  3. 当最后栈为空的时候, 算是有效括号匹配

代码:

class Solution {
    public boolean isValid(String s) {
        HashMap<Character, Character> map = new HashMap<>();
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
        Deque<Character> deque = new ArrayDeque<>();
        char[] ch = s.toCharArray();
        
        for(int i=0; i<ch.length; i++){
            if(deque.isEmpty() || ch[i]=='(' || ch[i]=='{' || ch[i]=='['){
                deque.push(ch[i]);
            } else{
                if(deque.pop() != map.get(ch[i])){
                    return false;
                }
            }
        }
        return deque.isEmpty();
    }
}

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

解题思路:

  1. 用栈模拟, 每当进栈一个字符时, 判断栈顶字符是否相等, 若相等则弹出, 不相等则入栈

  2. 代码:

class Solution {
    public String removeDuplicates(String s) {
        Deque<Character> deque = new ArrayDeque<>();
        char[] ch = s.toCharArray();
        for(int i=0; i<ch.length; i++) {
            if(deque.isEmpty() || deque.peek() != ch[i]){
                deque.push(ch[i]);
            }else{
                deque.pop();
            }
        }
        StringBuilder sb = new StringBuilder();
        while(!deque.isEmpty()){
            sb.append(deque.pop());
        }

        return sb.reverse().toString();
    }
}

150.逆波兰表达式

解题思路:

  1. 用栈模拟, 每当遇到一个运算符时, 就弹出栈顶两个元素进行计算, 然后将结果存入栈顶
  2. 最后只存在栈顶一个元素, 返回栈顶计算结果即可

代码:

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<String> deque = new ArrayDeque<>();
        for(int i=0; i<tokens.length; i++){
            if(tokens[i].equals("+")){
                int x = Integer.parseInt(deque.pop());
                int y = Integer.parseInt(deque.pop());
                deque.push(String.valueOf(y + x));

            }else if(tokens[i].equals("-")) {
                int x = Integer.parseInt(deque.pop());
                int y = Integer.parseInt(deque.pop());
                deque.push(String.valueOf(y - x));

            }else if(tokens[i].equals("*")) {
                int x = Integer.parseInt(deque.pop());
                int y = Integer.parseInt(deque.pop());
                deque.push(String.valueOf(y * x));

            }else if(tokens[i].equals("/")) {
                int x = Integer.parseInt(deque.pop());
                int y = Integer.parseInt(deque.pop());
                deque.push(String.valueOf(y / x)); 
                      
            }else {
                deque.push(tokens[i]);
            }
            
        }
        return Integer.parseInt(deque.pop());

    }
}