Day11 栈与队列02

20. 有效的括号

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频链接:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili

文章链接:代码随想录

知识点链接:【Java集合类】之 LinkedList(链表)-CSDN博客

(用于查找LinkedList的方法)

思路

利用栈,首先判断是否为奇数,奇数一定消不了。定义一个指针i遍历整个栈,将遍历到的左括号反着存进栈里。每次遍历到右括号的时候先与栈顶元素进行匹配,如果相等就消掉栈顶元素,不相等返回false(3)。如果还没遍历完栈就空了,同时出现右括号,说明右括号多了,返回false(2)。最后看栈是否为空,不为空则返回false(情况1)。

三种返回false情况

1.左括号多了

2.右括号多了

3.左括号和右括号不匹配

代码

class Solution {
    public boolean isValid(String s) {
        if(s.length()%2!=0)return false;
        LinkedList<Character>list=new LinkedList<>();
//左括号
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='(')list.add(')');
            else if(s.charAt(i)=='[')list.add(']');
            else if(s.charAt(i)=='{')list.add('}');
//
else if(list.isEmpty()||list.getLast()!=s.charAt(i)){
    return false;
}
else {
    list.removeLast();
}
        }
        if(list.isEmpty())return true;
        else return false;
    }
}

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

 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频链接:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili

文章链接:代码随想录

冷门方法

StringBuffer中的deleteCharAt(i);        i为索引

思路

注意只有top<0时元素才是空的。首先用指针遍历,如果指针与栈顶元素相同就删除该元素,不同则存入。

代码

class Solution {
    public String removeDuplicates(String s) {
        StringBuilder sb=new StringBuilder();
        int top=-1;//top为栈顶元素
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
           if(top>=0&&c==sb.charAt(top)){
                sb.deleteCharAt(top);//删除栈顶元素
                top--;
            }else{
                sb.append(c);
                top++;
            }
    }
    return sb.toString();
}

}

150. 逆波兰表达式求值

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频链接:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili

文章链接 :代码随想录

方法

int i=parseInt(String s)          String转int

Integer.volueOf(O)                类型转化

思路

名词解释:逆波兰表达式

计算机更明白的语言,先将算式转化为二叉树的形式,然后按照左中右的顺序写出。

这个过程可通过栈模拟,给到一个字符数组,遍历,遇到数字就存,遇到符号就取栈顶两个元素进行运算。

代码

注意

由于给的是字符串数组,所以不能强转,也不能用==,要用equals

-法和/法要特殊处理


class Solution {
    public int evalRPN(String[] tokens) {
       Deque<Integer> stack = new LinkedList();
        for (String s : tokens) {
            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 temp1 = stack.pop();
                int temp2 = stack.pop();
                stack.push(temp2 / temp1);
            } else {
                stack.push(Integer.valueOf(s));
            }
        }
        return stack.pop();
    }
}

总结

学习了两个小时,加深了对栈的理解,写波兰表达式这道题的时候自己写了一遍由于漏掉了许多东西,所以经常报错。感觉前两道题跟着视频走不难,后面一道题要注意的错误更多。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值