代码跟学Day11 【代码随想录】

第五章 栈与队列part02

大纲

● 20. 有效的括号
● 1047. 删除字符串中的所有相邻重复项
● 150. 逆波兰表达式求值

leetcode 20 有效的括号

思路

  • 可类型括号的相互匹配 自然想到了栈 左括号进栈 遇到右括号出栈

细节

  • 注意当栈中的左括号遇到不匹配的右括号返回false
  • 注意为空栈时遇到右括号的边界情况的判断

代码

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

复杂度

  • 时间 O(n)
  • 空间 O(n)

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

思路

  • 根据题目删除当前相邻的重复字符串 自然想到了使用栈来遍历此字符串

细节

  • 注意进栈的时机为栈空 出栈的时机为当前栈顶元素和当前遍历元素相同

代码

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (!stack.isEmpty() && stack.peek() == c) stack.pop();
            else stack.push(c);
        }
        StringBuilder sb = new StringBuilder();
        for (char c : stack) sb.append(c);
        return sb.toString();
    }
}

复杂度

  • 时间 O(n)
  • 空间 O(n)

leetcode 150 逆波兰表达式求值

思路

  • 经典的栈应用题 遇到数字存储 遇到操作符取栈顶两元素做运算

细节

  • 注意操作符是有左右操作之分的 如减法和除法 需要额外注意栈元素的位置
  • 注意当前作为运算的值也要存储到栈中

代码

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            String s = tokens[i];
            if ("+".equals(s)) 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 a = stack.pop(), b = stack.pop();
                stack.push(b / a);
            } else stack.push(Integer.parseInt(s));
        }
        return stack.pop();
    }
}

复杂度

  • 时间 O(n)
  • 空间 O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值