代码随想录算法训练营第11天 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

75 阅读1分钟

 20. 有效的括号 

思路:分别将三种左括号所对应的右括号进栈;如果该元素是右括号,每推一个元素就判断栈顶元素是否与推入的元素相等,如果不相等则直接返回false,如果相等则pop栈顶元素。

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            if (ch == '(') {
                stack.push(')');
            } else if (ch == '[') {
                stack.push(']');
            } else if (ch == '{') {
                stack.push('}');
            } else if (stack.isEmpty() || stack.peek() != ch) {
                return false;
            } else {
                stack.pop();
            }
        }
        return stack.isEmpty();
    }
}

题目链接/文章讲解/视频讲解:programmercarl.com/0020.%E6%9C…

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

思路:将元素一一推入,每次推入前都判断栈顶元素是否与要推入元素相等,如果相等则将栈顶元素推出,实现消消乐。

class Solution {
  public String removeDuplicates(String s) {
      Stack<Character> stack = new Stack<>();
      char ch;
      for(int i =0; i<s.length(); i++) {
          ch=s.charAt(i);
          if(stack.isEmpty()) {
              stack.push(ch);
          } else if(ch == stack.peek()){
              stack.pop();
          }else {
              stack.push(ch);
          }
      }
      //将栈中的字符转换为字符串输出
      String reverse = "";
      while (!stack.empty()) {
          reverse = stack.pop().toString() + reverse;
      }
      return reverse;
  }
}

题目链接/文章讲解/视频讲解:programmercarl.com/1047.%E5%88…

 150. 逆波兰表达式求值 

思路:逆波兰表达式,其实就是后缀表达式,遇到数字直接推入栈;遇到操作符,就将前面两个数字根据操作符进行处理

class Solution {
  public int evalRPN(String[] tokens) {
      Deque<Integer> stack = new LinkedList();
      for (String s : tokens) {
          if ("+".equals(s)) {        // leetcode 内置jdk的问题,不能使用==判断字符串是否相等
              stack.push(stack.pop() + stack.pop());      // 注意 - 和/ 需要特殊处理
          } else if ("-".equals(s)) {
              stack.push(-stack.pop() + stack.pop());
          } else if ("*".equals(s)) {
              stack.push(stack.pop() * stack.pop());
          } else if ("/".equals(s)) {
              int temp1 = stack.pop();
              int temp2 = stack.pop();
              stack.push(temp2 / temp1);
          } else {
              stack.push(Integer.valueOf(s));
          }
      }
      return stack.pop();
  }
}

题目链接/文章讲解/视频讲解:programmercarl.com/0150.%E9%80…

总结

今天三题难度不是很大,都是栈的基础应用,了解栈的性质以后,用起来就很得心应手了,