• 逆波兰表达式


    栈的应用之逆波兰表达式


    什么是逆波兰表达式呢??-->来源力扣150. 逆波兰表达式求值

    逆波兰表达式:

    逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

    平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
    该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
    逆波兰表达式主要有以下两个优点:

    去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
    适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

    也就是说我们平常写的对 数的加法减法乘法除法,都是这样的..的例如: ( 1 + 2 ) * ( 3 + 4 )-->中缀表达式,而我们这样能让计算机读懂呢??->这就引入了今天的逆波兰表达式也就是后缀表达式,我们就让中缀表达式转成后缀表达式。

    例如:1+2*3+(4*2+5)*6

    • 将所有运算都加上大括号
    • 将运算符移动到对应括号的外面
    • 去掉所有括号

    好了我们就得到了一个后缀表达式-->也就是计算机能读懂的计算

    那计算机是怎么通过这样的后缀表达式来计算出结果呢???

    那就是我们这样神奇的数据结构-->栈

    • 遇到数字就加入到栈中
    • 遇到运算符就出两个数字
    • 第一次出的放在运算符右边,第二次出的放运算符左边
    • 计算完成之后继续放入栈中
    • 最终栈顶元素就是最终表达式计算的结果

    代码实现:

    1. class Solution {
    2.     public int evalRPN(String[] tokens) {
    3.         //思路:遇到数字就入栈,如果遇到数字符号就出两个数进行计算
    4.         //计算结果继续入栈,一直遍历字符串结束
    5.         Stack<Integer> stack = new Stack<>();
    6.         for(int i =0;i<tokens.length;++i){
    7.             String str = tokens[i];
    8.             if(!isNumCharacter(str)){//判断是否是符号
    9.                //如果是数字的话就将其入栈
    10.                int num = Integer.parseInt(str);
    11.                stack.push(num);
    12.             }else{
    13.                 //如果是字符就弹栈,弹出两个数字
    14.                 int num2 = stack.pop();
    15.                 int num1 = stack.pop();
    16.                 switch(str){
    17.                     case "+":
    18.                          stack.push(num1+num2);
    19.                          break;
    20.                     case "-":
    21.                          stack.push(num1-num2);
    22.                          break;
    23.                     case "*":
    24.                          stack.push(num1*num2);
    25.                          break;
    26.                     case "/":
    27.                          stack.push(num1/num2);
    28.                          break;
    29.                 }
    30.             }
    31.         }
    32.         return stack.peek();
    33.     }
    34.   //用来判断这个字符串是否是字符
    35.     public boolean isNumCharacter(String s){
    36.         if(s.equals("+")||s.equals("*")||
    37.         s.equals("-")||s.equals("/")){
    38.             return true;
    39.         }
    40.         return false;
    41.     }
    42. }

  • 相关阅读:
    vue3如何写全局样式
    【数据结构与算法】第七篇:集合,映射
    王学岗ffmpeg编译
    附录5-本地生活案例(上拉触底,下拉刷新)
    移动通信覆盖自愈的研究与实现
    5-Spring架构源码分析-Spring IOC之 Spring 统一资源加载策略
    onPageNotFound踩坑
    SPI_OLED模块操作方法
    使用接口根据关键词取亚马逊商品数据
    ncnn神经网络计算框架在香橙派OrangePi 3 LTS开发板中的使用介绍
  • 原文地址:https://blog.csdn.net/m0_61210742/article/details/125554654