力扣150—逆波兰表达式(中等题)(思路详细+代码)

发布于:2023-01-11 ⋅ 阅读:(512) ⋅ 点赞:(0)

超链接👇
逆波兰表达式
这是一个逆波兰表达式(tokens)
在这里插入图片描述
如何把逆波兰表达式转换为中缀表达式:

每个运算符的前两个元素进行计算:左操作数±/右操作数,然后将其括起来,然后再往后找运算符,找到后,运算符的前两个元素进行计算。*

思路:创建一个栈,先把tokens字符串遍历,非运算符时将元素转换为整型后压栈,遇到运算符时,出栈2个元素,进行计算后放入栈中,然后接着遍历。

1.创建一个栈先遍历tokens字符串(foreach遍历 或者 别的遍历方法都可以)

 Stack<Integer> stack = new Stack<>();
       for(String x : tokens){
       };

2.遇到非运算符时 将元素转换为整型后压栈

 for(String x : tokens){
           //不是运算符时 让元素压栈
           if(!(x.equals("+")|| x.equals("-") || x.equals("*")|| x.equals("/"))){
               stack.push(Integer.valueOf(x));
               }

3.遇到运算符时 出栈两个元素分别为右操作数(第一个出栈)和左操作数(第二个出栈),进行计算后把结果入栈

Stack<Integer> stack = new Stack<>();
       for(String x : tokens){
           //不是运算符时 让元素压栈
           if(!(x.equals("+")|| x.equals("-") || x.equals("*")|| x.equals("/"))){
               stack.push(Integer.valueOf(x));
           }else{//否则 出栈两个 进行运算
             int right = stack.pop();//第一个出栈元素是右操作数
             int left = stack.pop();//第二个出栈元素是左操作数
              switch(x){//左操作数+-*/右操作数
                    case "+" :
                  stack.push(left + right);
                  break;
                    case "-" :
                   stack.push(left - right);
                  break;
                    case "*" : 
                   stack.push(left * right);
                  break;
                    case "/" :
                   stack.push(left / right);
                  break;
              }
           }
       }  

完整代码👇

class Solution {
    public int evalRPN(String[] tokens) {
       Stack<Integer> stack = new Stack<>();
       for(String x : tokens){
           //不是运算符时 让元素压栈
           if(!(x.equals("+")|| x.equals("-") || x.equals("*")|| x.equals("/"))){
               stack.push(Integer.valueOf(x));
           }else{//否则 出栈两个 进行运算
             int right = stack.pop();//第一个出栈元素是右操作数
             int left = stack.pop();//第二个出栈元素是左操作数
              switch(x){//左操作数+-*/右操作数
                    case "+" :
                  stack.push(left + right);
                  break;
                    case "-" :
                   stack.push(left - right);
                  break;
                    case "*" : 
                   stack.push(left * right);
                  break;
                    case "/" :
                   stack.push(left / right);
                  break;
              }
           }
       }  
     return stack.peek();//最后只有一个元素在栈中
    }
}

运行结果👇
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到