逆波兰表达式(后缀表达式)计算器的实现总结

Python 借助逆波兰表达式(后缀表达式)实现简单计算器 Python 借助逆波兰表达式(后缀表达式)实现简单计算器 文章目录Python 借助逆波兰表达式(后缀表达式)实现简单计算器0. 参考资料1. 中缀表达式转后缀表达式2. 后缀表达式的求值3. Python 代码实现4. 待完善 0. 参考资料 中缀表达式转换为后缀表达式 后缀表达式的计算 1. 中缀表达式转后缀表达式 中缀表达式转后缀表达式的过程中需要两个主要存储结构。 用于存放最... 阅读详情
   **逆波兰表达式又叫做后缀表达式。
   逆波兰表示法是波兰逻辑学家J・卢卡西维兹于1929年首先提出的一种表达式的表示方法 [1]**  

先说一下实现的思路

一)使用栈完成表达式的计算思路

1.通过一个index值(索引),来遍历我们的表达式
2.如何是一个数字直接入栈
3.如何发现是一个符号 就分以下情况
1)如何发现当前符号栈为空,就直接入栈
2)如何符号栈有操作符,就进行比较,如何当前的操作符
的优先级小于或者等于栈中的操作符,就需要从栈中pop
出两个数,再从符号栈中pop出一个符号,进行运算,将
得到的结果入数栈,然后将当前的操作符入符号栈,如果
当前的操作符的优先级大于栈中的操作符,就直接入符号栈
4.当表达式扫描完毕,就顺序的从数栈的符号栈中pop出相
应的数和符号,并运行
5.最后在数栈中就只有一个数字,就是表达式的结果

二)中缀表达式转后缀表达式的思路步骤分析

  1. 初始化两个栈:运算符栈是s1和储存中间结果的栈
  2. 从左至右扫描中缀表达式
  3. 遇到操作数时,将其压入S2
  4. 遇到运算符时,比较其与S1栈顶运算符的优先级
    1) 如果S1为空,或者栈顶运算符为左括号,则直接将其运算符入栈
    2) 否则,若优先级比栈顶运算符的高,也将运算符压入s1
    3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(1)与s1中的新的栈顶运算符相比较
  5. 遇到括号时:
    1) 如果是左括号“(”,则直接压入s1
    2) 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
  6. 重复步骤2至5,直到表达书的最右边
  7. 将s1中剩余的运算符依次弹出并压入S2
  8. 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
    有了这两个思路,下面就是具体的实现方法

第一步先写两个方法中缀、后缀转list

    //将后缀表达式转成对应的list
    public static List<String> getListString(String suff) {
        String[] split = suff.split(" ");
        List<String> list = new ArrayList<String>();
        for (String item : split) {
            list.add(item);
        }
        return list;
    }

    /*将中缀表达式转成对应的list s="1+((2+3)*4)-5"*/
    public static List<String> toinfixExpression(String s) {
        List<String> list = new ArrayList<String>();
        int i = 0;
        String str;
        char c;
        do {
            /*如果c是一个非数字,则加入到list中*/
            if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {
                list.add("" + c);
                i++;
            } else {//如果是一个数 则考虑多位数
                str = "";
                while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57) {
                    str += c;
                    i++;
                }
                list.add(str);
            }
        } while (i < s.length());
        return list;
    }

第二步完成中缀表达式转后缀表达式 这个比较难理解参考上面的思路(二)

  /*将中缀表达式对应的list转化为后缀表达式对应的list*/
    public static List<String> parsesuffix(List<String> ls) {
        Stack<String> s1 = new Stack<String>();//符号栈
        List<String> s2 = new ArrayList<String>();//储存中间结果的列表list2
        for (String item : ls) {
            if (item.matches("\\d+")) {//使用正则表达式判断是否是一个(多位)数
                s2.add(item);

            } else if (item.equals("(")) {
                s1.push(item);
            } else if (item.equals(")")) {
                while (!s1.peek().equals("(")) {
                    s2.add(s1.pop());
                }
                s1.pop();//将(弹出s1栈,消除小括号
            } else {
                while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) {
                    s2.add(s1.pop());
                }
                s1.push(item);

            }
        }


        while (s1.size()!=0){
            s2.add(s1.pop());
        }
          return s2;

    }

第三步实现计算后缀表达式的方法

 //完成对逆波兰表达式的运算
    /*
     * 从左到右依次扫描 将3和4入堆栈
     * 遇到+运算符,因此弹出4和3 计算出3+4的值 7 压入栈
     * 将5入栈
     * 接下来是*运算符 弹出5和7 计算出5*7=35压入栈
     * 将6压入栈
     * 最后是-运算符 计算出35-6的值29 即是最终的结果*/
    public static int calculate(List<String> ls) {

        Stack<String> stack = new Stack<String>();
        int res = 0;
        for (String item : ls) {
            if (item.matches("\\d+")) {
                stack.push(item);
            } else {
                int num1 = Integer.parseInt(stack.pop());
                int num2 = 0;
                if (!stack.empty()) {
                    num2 = Integer.parseInt(stack.pop());
                }
                if (item.equals("+")) {
                    res = num1 + num2;
                } else if (item.equals("-")) {
                    res = num2 - num1;
                } else if (item.equals("*")) {
                    res = num2 * num1;
                } else if (item.equals("-")) {
                    res = num2 / num1;
                } else {
                    throw new RuntimeException("运算符有误");
                }
                stack.push("" + res);

            }
        }
        return res;

    }

}
//补充一下比较操作符优先级的方法
class Operation {
    public static int getValue(String str) {
        switch (str) {
            case "+":
                return 0;

            case "-":
                return 0;

            case "*":
                return 1;

            case "/":
                return 1;

            default:
                return -1;
        }
    }
}

第四步就是最后测试了

public class PolandNotation {
    public static void main(String[] args) {
   /*(3+4)*5-6对应的前缀表达式是-*+3456
              对应的后缀的表达式34+5*6-
              此次是后綴演示
   * */
//        String suff = "3 4 + 5 * 6 -";
//        /*先将suff表达式放入到arrayList中
//         * 将Arraylist 传递给一个方法 遍历arraylist 配合栈完成计算*/
//        List<String> list = getListString(suff);
//        System.out.println(list);
//        int res = calculate(list);
//        System.out.println("res=" + res);
        String string="1+((2+3)*4)-5";
        List<String> ls1=toinfixExpression(string);
        System.out.println("中缀表达式="+ls1);
        List<String> ls2=parsesuffix(ls1);
        System.out.println("后缀表达式="+ls2);
        int res=calculate(ls2);
        System.out.println("res="+res);
    }

这是结果图
在这里插入图片描述

使用逆波兰式(后缀表达式)实现多功能计算器 由于这是之前的小作业了,之前贴出来没注意,后来发现格式太乱了根本看不了,所以今天再贴出来一下,这次的计算器比我之前写的要复杂很多,主要是通过逆波兰式实现的,没有界面,计算器是我之前的一个软肋啊,编了好多次都没有写出来。 这次这个,我试着调了很多次bug,以及很多种情况,尽量完善了,但是如果还有没考虑周全的,希望大家提出来,亲测代码可用。当然,为了方便起见,我把代码都整合到一个cpp文件的,主要也是 阅读详情

相关推荐

【数据结构与算法 7】中缀表达式转为后缀表达式,实现逆波兰计算器

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。一个人可以走的很快,但一群人才能走的更远。

362

编译原理逆波兰式实验java_【实验三】—— 逆波兰式生成实验报告

实验三 逆波兰式生成实验报告一、实验名称:逆波兰式生成二、仪器、设备:计算机三、参考资料:《编译原理教程》习题解析与上机指导(西安电子科技大 胡元义等)四、实验目的:将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式。五、实验内容:(实验步骤)⑴ 按实习目的和要求,用C语言编写一个逆波兰式生成程序,同时考虑相应的数据结构。⑵ 调试调试例子应包括符合语法规则的算术表达式,以及分析程序能...

weixin_28677005的博客 2182

编译原理实验报告6-逆波兰式的翻译和计算.doc

逆波兰式的翻译和计算。编译原理的实验报告,有利于新手对于逆波兰的基础理解。文件中给出了具体的代码和理解,还有结果截图显示。采用C语言编写,简单易懂。就一个实验报告!!

关于逆波兰表达式的一些收获。

1.在使用scanf和printf进行赋值、输入操作的时候,格式符是个很重要的点,它会限制scanf函数存放参数的格式!!! 例如:      char a;      scanf("%d",&a);//最后得到的就是一个按照十进制整数输入的数字,如果此时输入'a','n'、、之类的字符,VS上会将对应位置初始化为-52(不知道为什么)。      scanf("%c",&a)//

haha_kai的博客 889

编译原理实验报告 完整代码 完美运行 逆波兰式 无符号数

编译原理实验报告 完整代码 完美运行 逆波兰式 无符号数

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 504

逆波兰表达式学习日记(1)

先看了一下栈的基本原理,也就是所谓的后进先出,然后就想完整的学习一下逆波兰表达式。下午刚上完工程制图(工程制图没认真听啊orz.....),回来就想着先写第一部分吧。 前面说了一堆废话,先给个例子 9+(3-1)×3+10/2  --------> 931-3*+102/+ 将中缀表达式转化成后缀表达式,原理很简单,我先做一个关于没有“(”与“)”的例子,来简单的解释一下这个过程。

子观鱼 842

别再手动对照了!用Python+ArcGIS Pro一键搞定三调数据转土地三大类

本文介绍如何利用Python和ArcGIS Pro实现三调数据向土地三大类的自动化转换,大幅提升国土空间规划和土地变更调查的工作效率。通过封装分类规则为Python函数并集成到ArcGIS Pro脚本工具中,解决了传统手动操作耗时且易错的问题,适用于大规模数据处理场景。

weixin_29081101的博客 306

逆波兰表达式简单总结

逆波兰表达式rpn(reverse Polish notation),又叫后缀表达式。学习逆波兰表达式的算法首要要知道为什么要用逆波兰表达式,这个问题可以从逆波兰表达式的优点来回答,使用逆波兰表达式只要用出栈和进栈两种简单操作就可以进行任何普通表达式的运算。原理如下:如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈

Guix 1462

windows系统下,如何为comfyui如何安装triton

​ 有些加速插件、模型在安装的时候,比如说sageattention的安装,就需要提前安装triton这个包,不过这个包有点特殊,windows下略微不好装,经常会装失败。 🎠如何安装 之前也有人介绍过,要到github上找个wheel文件,找到对应的版本安装下就好了。 问题是:https://github.com/woct0rdho/triton-windows/releases 这个git地址上,已经找不到wheel文件了... ​

聚梦小课堂 4503

STM32F103xx / STM32F429VET6最小系统原理图

心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别,手头没有开发板,本着能勤俭节约的原则自己先做一块看看能不能成,看了一下STM32F429VET6的芯片在F429xx中最便宜,对照着数据手册绘制了原理图画了PCB,目前打板中,焊接完如果跑不通回来修改文章。这里我们可以看到,VDD是标准工作电压,VDDA是模拟工作电压,且VDDA必须与VDD等电位,VBAT是备份工作电压,一般接纽扣电池电源,如果存在VREF+引脚,则要求VDDA-VREF+ < 1.2V。截图下来比较糊,不知道为什么。

m0_51294753的博客 1万+

前缀、中缀、后缀表达式及逆波兰计算器实现

文章目录1.前缀表达式(波兰表达式)1.1 介绍1.2 前缀表达式的计算机求值2.中缀表达式3.后缀表达式(逆波兰表达式)3.1 介绍3.2 后缀表达式的计算机求值4.逆波兰计算器5.中缀表达式转换为后缀表达式5.1 思路分析5.2 代码实现6.完整版逆波兰计算器 1.前缀表达式(波兰表达式) 1.1 介绍 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。 举例说明:(3+4)*5-6 对应的前缀表达式就是 - * + 3 4 5 6 1.2 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字

张大安的博客 1391

量子-经典混合架构与动态QUBO建模

量子-经典混合架构与动态QUBO建模的结合,是当前量子计算与经典计算融合领域的前沿方向。通过将量子计算的并行性与经典计算的灵活性结合,该技术为解决复杂动态优化问题(如实时调度、金融投资组合优化、电力系统控制等)提供了全新的方法论。:将发电机组调度分解为QUBO(启停决策)与非QUBO(功率分配)子问题,通过3块ADMM协调;c_i(t) $随外部环境(如电力需求、市场价格)动态调整。量子-经典混合架构与动态QUBO建模的结合,标志着优化计算从。:每分钟根据市场波动调整QUBO的收益率-风险系数;

百态·数智思维 | 聚焦大数据、量化与未来AI 1334

七、前缀、中缀、后缀表达式规则——逆波兰计算器分析与实现

一、前缀、中缀、后缀表达式规则       1.前缀表达式(波兰表达式)       前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前       举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6       **前缀表达式的计算机求

陈大大的博客 364

ADS基础教程19 - 电磁仿真(EM)基本概念和实操

一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip(微带线)3.添加Substrate4.Momentum仿真四、总结EM全称Electromagnetic,即electro(电)magnetic(磁)。ADS为设计和评估现代通信系统产品提供了电磁仿真工具(EM)。EM包括Momentumsimulator(动量仿真器)和FEM。

XZ_ZC的博客 1万+

vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)

vue3接入腾讯人脸核身,腾讯云人脸核身Vue3+后端代码,H5人脸核身,vue3 H5如何使用腾讯人脸核身sdk,vue3+thinkphp腾讯人脸核身,Spring Boot接入腾讯云人脸核身教程,hinkphp腾讯人脸核身,vue3人脸核身插件接入流程,vue+spring boot实现腾讯人脸核身,vue3接入腾讯云【增强版人脸核身接入】,vue3 h5微信公众号网页腾讯云慧眼人脸核身,tvue3接入人脸核身SDK,vue3+typescrip+vite接入慧眼实名认证,vue3腾讯云活体人脸核身(

✅ 精选推荐文章 4121

中缀转后缀表达式以及逆波兰计算器的实现

中缀转后缀表达式以及逆波兰计算器的实现

qq_54469537的博客 599

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

⑩下一个扫描到 - 符号,由于 - 的优先级与 + 相同,故执行 4.(3):将s1栈顶的运算符弹出并压入到s2中,再次转到 4.(1) 与s1中新的栈顶运算符相比较,由于原来的 + 入了s2栈,即s1栈为空,所以直接将 - 运算符入s1栈。②遇到 + 运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3 + 4 的值,得 7 ,再将 7 入栈;②遇到 + 运算符,因此弹出 3 和 4(3为栈顶元素,4为次顶元素),计算出 3 + 4 的值,得 7,再将 7 入栈。

weixin_44883789的博客 1339

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

栈实现逆波兰计算器(后缀表达式)

逆波兰计算器   设计一个逆波兰计算器,可以完成如下任务:    (1)输入一个逆波兰表达式(后缀表达式),使用栈(stack),计算其结果。    (2)支持小括号和多位数整数。    (3)思路分析       从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到...

a804847944的博客 395

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构与算法--Python栈 栈实现综合计算器和逆波兰计算器 前缀表达式 中缀表达式 后缀表达式 逆波兰表达式

Python栈 栈实现综合计算器和逆波兰计算器

storyfull 1242

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

前缀、中缀、后缀表达式介绍(逆波兰计算器_代码实现)

文章目录1、前缀、中缀、后缀表达式1.1、前缀表达式(波兰表达式)2.2、中缀表达式2.3、后缀表达式(逆波兰表达式)2、逆波兰计算器3.1、中缀表达式转换为后缀表达式3.2、后缀表达式的计算机求值3.3、逆波兰计算机_代码实现 1、前缀、中缀、后缀表达式 1.1、前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前, 举例说明:(3+4)×5-6对应的前缀表达式就是【-x+3456】 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算

qq_45974648的博客 465

前缀,后缀表达式(逆波兰表达式),中缀表达式转为对应的后缀表达式,逆波兰计算器的实现(java)

波兰表达式1.前缀,中缀,后缀表达式规则介绍1.前缀表达式(波兰表达式) 1.前缀,中缀,后缀表达式规则介绍 1.前缀表达式(波兰表达式) 前缀表达式的运算符位于操作符之前 例如:(3+4)*5-6对应的前缀表达式就是== - * + 3 4 5 6== 前缀表达式的计算机求值 从左至右扫描表达式,遇到数字时就将数字压入堆栈,遇到运算符时弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素和次顶元素) 完成堆逆波兰表达式的运算 //完成对逆波兰表达式的运算 /* * 1)从左至右扫描,将3

m0_57105290的博客 931

Java数据结构:前缀、中缀、后缀表达式与逆波兰计算器的实现

本文对前缀、中缀、后缀表达式进行了讲解,实现了中缀表达式转后缀表达式,并利用栈实现了逆波兰表达式计算器求值。

黄小黄的博客 2876

栈(前缀、中缀、后缀表达式及逆波兰计算器的实现)

通过我们刚刚介绍的前缀表达式的计算机实现来讲,只要前缀表达式是正确的,我们不需要去判断运算符的优先级,并且在一个栈中就可以完成整个表达式的运算;要求输入一个逆波兰表达式(后缀表达式),我们使用系统提供的栈(Stack)计算其结果;支持小括号和多位数整数,我们这里主要讲的是数据结构,因此计算器进行了简化,只支持整数运算;

Strine的博客 391

栈实现逆波兰计算器(前缀、中缀、后缀表达式)

关键词:前缀表达式 中缀表达式 后缀表达式 波兰式 逆波兰式 栈 逆波兰计算器 前缀表达式到后缀表达式的转换 小数计算器 综合计算器

Ronz 的博客 831
上一篇: 五子棋算法之稀疏数组算法(内存压缩优化处理)
下一篇: 递归八皇后问题
来来爱编程
博客等级 码龄7年 375粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值