【Java】代码随想录栈和队列第十一天| LeetCode20 有效的括号、LeetCode1047 删除字符串中的相邻重复项、LeetCode150 逆波兰表达式求值

今日内容: 

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

LeetCode20 有效的括号

题目链接:20. 有效的括号

思路:由于栈结构的特殊性,非常适合做对称匹配类的题目(即有顺序的匹配)。

deque可以当栈使用(push、pop),也可以当队列使用(add、remove)(offer、poll)

push进对应的下括号,然后判断空或者有不重复项时false,不然就是在重复情况下pop出重复项

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

LeetCode1047 删除字符串中的相邻重复项

题目链接:1047. 删除字符串中的相邻重复项

思路:空或不存在重复时push,存在重复时pop出重复字母,最终留在栈中的就是非重复项

这道题还可以用其他两种做法,一种是直接用StringBuider类型的作为栈

另一种是用双指针法,参考

class Solution {
    Deque<Character> q1 = new LinkedList<>();
    public String removeDuplicates(String s) {
        int size = s.length();
        for(int i=0;i<size;i++){
            char ch = s.charAt(i);
            if(q1.isEmpty() || q1.peek() != ch){
                q1.push(ch);
            }
            else q1.pop();
        }
        //将栈中的字母逆序输出的一种方式
        String str ="";
        while(!q1.isEmpty()){
            str = q1.pop() + str;
        }
        return str;
    }
}

LeetCode150 逆波兰表达式求值

题目链接:150. 逆波兰表达式求值

我们平时使用的中缀表达式例如:4 + 13 / 5,对计算机十分不友好,转化为后缀表达式以后计算机可以利用栈来进行顺序处理,就很方便了

● ==与equals的区别:1. ==是一个关系运算符,对于基本数据类型会比较内部的值是否相等,但是对于“String”和“Integer”等引用数据类型,会比较两个对象的地址是否相等。所以这里用equals,比较对象的内容是否相等。

● String类型转化为int:方法①。Integer.parseInt(s);(只对String类型转化为int类型)

方法②。Integer.ValueOf(s).intValue;其中Integer.valueOf()可以将基本类型int或者将String转换成包装类型Integer,然后intValue把integer转化为int。

● 逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

  • 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

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();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值