LeetCode :150. 逆波兰表达式求值(含求后缀表达式和中缀转后缀表达式)

目录

题目描述:

代码:

拓展:

中缀表达式转后缀表达式代码:


题目描述:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

复制代码
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

复制代码
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

复制代码
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

代码:

   public int evalRPN(String[] tokens){//数组长度是变化的
        LinkedList<Integer> stack = new LinkedList<>();//java自带的栈  容量自动变化
        for(String i:tokens){
            if(i.equals("+")){
                int a = stack.pop();
                int b = stack.pop();
                stack.push(a+b);
            }else if(i.equals("-")){
                int a = stack.pop();
                int b = stack.pop();
                stack.push(b-a);
            }else if(i.equals("*")){
                int a = stack.pop();
                int b = stack.pop();
                stack.push(a*b);
            }else if(i.equals("/")){
                int a = stack.pop();//a
//                System.out.println(a);
                int b = stack.pop();//13
                System.out.println(b);
                stack.push(b/a);
            }else {
                stack.push(Integer.parseInt(i));//转换为int类型
            }
        }
        return stack.pop();
    }

拓展:

中缀表达式转后缀表达式代码:

package 表达式;

import java.util.LinkedList;

public class InfixToSuffix {
    // 中缀表达式转后缀表达式
    /* a+b   ab+
    *  a*b-c  ab*c-
    *  a+b*c   abc*+
    * 1.遇到非字符串,直接拼串
    * 2.遇到运算符  判断优先级,
    * 如果优先级高,则直接入栈,
    * 否则,>= 将栈内元素出栈,拼接 再入栈
    * 左括号直接入栈, 右括号把遇到左括号前的所有符号都出栈
    * 遍历完成,栈里剩余运算符 依次出栈拼接
    * */
    public static void main(String[] args) {
//        String exp = "a+b*c";
//        String exp = "1+2*3-4/5";
        String exp = "1+2*3-4/5*(6+7)";
        System.out.println(infixToSuffix(exp));

        }
    //判断优先级  +- 1  * / 2
    static int priority(char c) {
        switch(c){
            case '(':
                return 0;
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            default:
                return -1;
        }
    }
    // 中缀表达式转后缀表达式
    static String infixToSuffix(String exp){
        LinkedList<Character> stack = new LinkedList<>();
        StringBuilder sb = new StringBuilder(exp.length());
        for(int i=0;i<exp.length();i++){
            char c = exp.charAt(i);
            switch(c){
                case '+':
                case '-':
                case '*':
                case '/':{
                    if(stack.isEmpty()){//栈为空,直接入栈
                        stack.push(c);
                        break;
                    }else{
                        if(priority(c)>priority(stack.peek())) {//栈顶运算符优先级低
                            stack.push(c);
                            break;
                        }
                        else{
                            while(!stack.isEmpty()&&priority(c)<=priority(stack.peek())){//栈顶运算符优先级高或相等
                                sb.append(stack.pop());
                            }
                            stack.push(c);//通过前面对比,把优先级高或相等的先拼接,之后再把优先级低的运算符入栈
                            break;
                        }
                    }
                }
                case '(':
                    stack.push(c);
                    break;
                case ')':{
                    while(!stack.isEmpty()&&stack.peek()!='('){
                        sb.append(stack.pop());
                    }
                    stack.pop();//左括号弹出
                    break;
                }
                default:{
                    sb.append(c);
                    break;
                }
            }
        }
        while(!stack.isEmpty()){
            sb.append(stack.pop());
        }
        return sb.toString();

    }
}
相关推荐
**之火11 分钟前
Web Components 是什么
前端·web components
顾菁寒12 分钟前
WEB第二次作业
前端·css·html
斌斌_____13 分钟前
通过反射机制,比较两个对象的字段值的差异
java
你好龙卷风!!!14 分钟前
vue3 怎么判断数据列是否包某一列名
前端·javascript·vue.js
幼儿园园霸柒柒16 分钟前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
cooldream200917 分钟前
Spring Boot中集成MyBatis操作数据库详细教程
java·数据库·spring boot·mybatis
阑梦清川26 分钟前
JavaEE进阶---第一个SprintBoot项目创建过程&&&我的感受
java·java-ee·springboot
程序员清风31 分钟前
浅析Web实时通信技术!
java·后端·面试
wyh要好好学习38 分钟前
SSM— spring,springMVC,mybatis整合
java·spring
忘梓.42 分钟前
排序的秘密(1)——排序简介以及插入排序
数据结构·c++·算法·排序算法