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

文章详细介绍了LeetCode上的几道题目,包括有效括号问题,使用双端队列(Deque)进行匹配判断;删除字符串中的所有相邻重复项,利用ArrayDeque实现;以及逆波兰表达式求值,处理运算符和栈的操作。文章强调了Deque在解决这类问题中的重要性,并提供了AC代码示例。
摘要由CSDN通过智能技术生成

Leetcode 20. 有效的括号

题目详解

数据结构 双端队列(deque)

deque (double-ended
queue,双端队列)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

Deque有三种用途:

  • 普通队列(一端进另一端出):
Queue queue = new LinkedList()Deque deque = new LinkedList()
  • 双端队列(两端都可进出)
Deque deque = new LinkedList()
  • 堆栈
Deque deque = new LinkedList()

注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。Deque堆栈操作方法:push()、pop()、peek()。引用自博主devnn

思路

分三种情况进行讨论
1 左括号多了

如果都判断完了字符串里的i都走了一遍,栈里还有东西 不为空 也return false在这里插入图片描述

2 匹配类型不一样

stack.peek() != a[i];

3 右括号多了 在消消乐时,发现字符串没消除完 栈空了

只需要判断栈stack 是否为空集就可以了
stack.isEmpty(); return false;

在这里插入图片描述
在这里插入图片描述

报错

关于java中的“error: bad operand types for binary operator
在这里插入图片描述
前后类型不一致 后来一看是因为 我在定义deque时 忘记将其 character了
Deque<Character> st= new LinkedList<>();

Ac代码

class Solution {
    public boolean isValid(String s) {
   //定义一个双端队列
   Deque<Character> st= new LinkedList<>();
   // 进行for循环  用ch传递s[i]
   for(int i=0;i<s.length();i++)
   {
       char ch= s.charAt(i);
       if(ch == '(')
         { st.push(')');}
       else if( ch =='{') 
          {st.push('}');}
       else if(ch == '[')
          {st.push(']');}
       //进行右边判断
       else if
       ( st.isEmpty() || st.peek() != ch)
        {
        return false;
        }
       else
           st.pop();  //如果相等的话        
   }
        return st.isEmpty();
    }
    
}

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

题目详解

数据结构 ArrayDeque类

ArrayDeque类是 双端队列的线性实现类。
☞ ArrayDeque是采用数组方式实现的双端队列。
☞ ArrayDeque的出队入队是通过头尾指针循环,利用数组实现的。
☞ ArrayDeque容量不足时是会扩容的,每次扩容容量增加一倍。
☞ ArrayDeque可以直接作为栈使用。当用作栈时,性能优于Stack,当用于队列时,性能优于LinkedList。
————————————————
引用博主「妙乌」的文章

思路

与上一道题相似 都是消除类的题,这道题里的栈放的是已经遍历过的数据

AC代码

class Solution {
    public String removeDuplicates(String s) {
        ArrayDeque<Character> st =new ArrayDeque<>();
        char ch;
        for(int i=0;i<s.length();i++)
        {
             ch =s.charAt(i);
             if( st.isEmpty()|| st.peek()!= ch)
             {
                 st.push(ch);
             }
             else
             {
                 st.pop();
             }

        }
         String result ="";
         while(! st.isEmpty())
         {
             result= st.pop()+result;
         }
         return result;
    }
}

150. 逆波兰表达式求值

题目详解

后缀表达式 计算机只要按着顺序去处理这个字符串就可以 用的栈

报错

 

>   java.lang.NumberFormatException: For input string: "/"

在这里插入图片描述
在这里插入图片描述
虽然报错的地方是下面 不过 根据报错信息来看 应该跟/有关仔细一看多了一个空格 导致报错了

难点

根据条件将符合条件的数据从栈中跳出来 很简单 ,稍微难点就是“-”
和“/” 那块有点特殊

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

AC代码

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

收获

今天开始使用Deque了 ,之前一直没接触过 双端队列 , 差不多可以了
我饿了
我去弄点吃的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值