逆波兰式是什么?

1. 逆波兰式是什么?

逆波兰式,也称逆波兰记法(Reverse Polish Notation,缩写为RPN),是一种在数学和计算机科学中用于表示算术表达式的方法。它的特点是操作符在操作数的后面,不需要括号来改变运算的优先级。

举个例子,我们通常写出的算术表达式是“2 + 3”。在逆波兰记法中,这个表达式会被写作“2 3 +”。

逆波兰记法的一个主要优点是它可以消除表达式中的括号,并使得运算的执行顺序更加明确。在计算机科学中,逆波兰记法可以更简单高效地进行表达式的求值。例如,使用栈数据结构,可以轻松地计算逆波兰表达式。

逆波兰记法得名于波兰逻辑学家扬·卢卡谢维奇(Jan Łukasiewicz)。虽然他原创的“波兰记法”将操作符放在操作数之前(如“+ 2 3”),但“逆波兰记法”将操作符放在操作数之后,这使得它在实际中更容易使用,特别是在计算机科学领域。

我们来看一些逆波兰记法(Reverse Polish Notation, RPN)的例子。以下是一些常见的算术表达式以及他们对应的逆波兰表示形式:

常规表达式:(7 - 4) * 2,对应的RPN表示:7 4 - 2 *

解释:先从7中减去4,然后将结果乘以2。

常规表达式:5 + ((1 + 2) * 4) - 3,对应的RPN表示:5 1 2 + 4 * + 3 -

解释:先进行1+2,然后将结果乘以4,接着与5相加,最后从中减去3。

常规表达式:(3 + 4) * (5 * 6),对应的RPN表示:3 4 + 5 6 * *

解释:先进行3+4,同时进行5*6,然后将两个结果相乘。

2. 按照逆波兰式进行计算

这是一个使用Java实现的逆波兰式(RPN)计算器的简单示例。该计算器可以处理包含四种基本算术运算的RPN表达式。

import java.util.Stack;public class RPNCalculator {public static int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {switch (token) {case "+":   //但是符号时,就进行运算stack.push(stack.pop() + stack.pop());    //取出当前栈里面的2个元素,进行运算后,再push进去break;case "-":stack.push(-stack.pop() + stack.pop());break;case "*":stack.push(stack.pop() * stack.pop());break;case "/":int n1 = stack.pop(), n2 = stack.pop();stack.push(n2 / n1);break;default: // 如果是普通字符,则直接入栈stack.push(Integer.parseInt(token));}}return stack.pop();}public static void main(String[] args) {String[] rpnExpression = {"2", "1", "+", "3", "*"};System.out.println(evalRPN(rpnExpression));}
}

在这个例子中,evalRPN函数接受一个字符串数组,每个字符串表示RPN表达式中的一个元素(一个数字或一个操作符)。然后,它使用一个栈来存储和操作数字。

对于每个元素,它检查是否是一个操作符(“+”、“-”、“*” 或 “/”)。如果是,它就从栈中弹出两个元素,执行相应的操作,然后将结果推回到栈中。如果元素是一个数字,它就将其推到栈中。

在处理所有元素后,栈顶的元素就是表达式的结果。

在main函数中,我们创建了一个逆波兰表达式字符串数组{“2”, “1”, “+”, “3”, “*”},这个表达式等同于常规表达式(2+1)*3,然后我们调用evalRPN函数计算它。计算结果将会打印出来。

以3+4为例,进行解析,对应的波兰形式是 3 4 +:
1)按照波兰形式,压入栈
在这里插入图片描述
2)压完后,从上向下,取出栈中的元素,一般顶层一定是一个运算符
当从栈中取出运算符号后,会接着把下面的2个元素取出,然后运算,再压入栈
取出+号后, 取出 4 ,再取出3,进行运算,得到7,然后压入栈

此时栈的状态:
在这里插入图片描述
3) 继续把后续的波兰式压入栈,依次压入5、6、*号
在这里插入图片描述
4)
继续把后续的波兰式压入栈,依次压入5、6、*号

当栈的顶层是符号时,又要进行运算,取出下面的2个元素,进行运算

5*6=30,把30压入栈

此时栈的状态:
在这里插入图片描述
5)继续压入波兰式中的内容 ,是最后一个*号

在这里插入图片描述
30*7 + 210

3. 如何转化普通表达式为逆波兰形式

(3 + 4) * (5 * 6) 是如何转为 3 4 + 5 6 * * 的 ?

我们知道 A + B 需要被整理为: A B + 那么对于复杂公式,同样如此,我们可以把A看做是一个 (3+4)的表达式,这样就好理解了。

那么(3 + 4) * (5 * 6) 进行处理的顺序:
1) 先把大的模块进行转换 (3 + 4) (5 * 6) *
1) 把步骤1中的 3 + 4 替换为 3 4 +
2) 把步骤1中的 5 * 6 替换为 5 6 *
3) 得到最后的 3 4 + 5 6 * *

注意上面的是代数思想,不是计算机的处理方式,如过想写个程序进行计算,那么需要从左至右进行处理,基本原理和RPNCalculator 类似,只不过是反着写

参考

逆波兰式是什么?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20739.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevOps基础服务2——Jenkins

文章目录 一、基本了解1.1 CI/CD介绍1.2 基于Docker的CI/CD 二、安装jenkins三、页面管理3.1 当前系统用户配置3.2 系统配置3.3 全局工具配置3.4 插件管理3.4.1 安装插件3.4.2 上传插件 3.5 用户设置3.6 查看日志3.7 汉化设置 一、基本了解 DEVOPS概念&#xff1a; DevOps是一种…

网络ping丢包什么原因(附解决方案)

​  数据包丢失是一种网络问题&#xff0c;当通过网络(或设备之间或通过 Internet)传输的数据包在传输过程中丢失或丢弃并且无法到达目的地时&#xff0c;就会发生这种情况。简单来说&#xff0c;数据包丢失是指数据包无法通过互联网从发送者成功传输到接收者。 如何检测数据…

LiveGBS流媒体平台GB/T28181功能-支持UDP、TCP被动、TCP主动模式流传输模式之间有什么区别?

LiveGBS流媒体平台-国标流媒体服务几种流传输模式UDP、TCP被动、TCP主动模式区别是什么 1、背景1、GB28181流传输模式1.1、UDP1.2、TCP 被动1.3、TCP 主动 2、切换流传输模式2.1、编辑2.2、下拉切换 3、搭建GB28181视频直播平台 1、背景 国标GB28181协议中&#xff0c;视频流到…

eNSP-VRRP虚拟路由器冗余技术

VRRP-虚拟路由器冗余技术 文章目录 VRRP-虚拟路由器冗余技术一、拓扑结构二、基本配置三、测试验证四、知识点详解1.VRRP路由器2.报文格式3.工作过程 一、拓扑结构 二、基本配置 R1: #配置ip <Huawei>sys [Huawei]sys r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

Perl 7 - 使用 Perlbrew 管理perl 版本

文章目录 关于 Perlbrew安装 Perlbrew使用 perlbrew 安装/管理 perl 版本 关于 Perlbrew 官网&#xff1a;https://perlbrew.pl 相关文档&#xff1a; App::perlbrew https://metacpan.org/pod/App::perlbrew Perlbrew 是一个工具&#xff0c;用于管理您$HOME 目录(或您指定的…

嵌入式LinuxLED驱动开发实验

目录&#xff1a; 1. Linux下LED灯的驱动原理1.1. 地址映射1.1.1. 实际物理地址映射到虚拟地址的函数1.1.2. 内存访问函数 2.硬件原理图分析3. 实验程序编写3.1. 驱动程序编写3.2. 应用程序编写 4. 运行测试 1. Linux下LED灯的驱动原理 我们在裸机实验的时候&#xff0c;都是通…

【数据结构】红黑树

文章目录 红黑树1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树的结构5. 红黑树的插入操作 红黑树 1. 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者是Black。通过任何一…

【Docker】Docker的部署含服务和应用、多租环境、Linux内核的详细介绍

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

简化生活之让AI以指定格式输出

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 合集地址 今天京东也宣布即将发布了自己的大模型&#xff0c;那么使用AI大模型进行工作或者生活将是必不可少的步骤。 建立命令 AI大模型是一种生成式聊天对话模型&#xff0c;我们可以通过预先定义命令的方式…

HTML的Input(type)的属性都有哪些

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f33c;欢迎小伙伴们访问到博主的文章内容&am…

flutter开发实战-Running Gradle task ‘assembleDebug‘ 的解决方法

flutter开发实战-Running Gradle task ‘assembleDebug‘ 的解决方法 使用Android studio经常出现Running Gradle task ‘assembleDebug‘问题&#xff0c;记录一下解决方法。 一、在Android目录下更改build.gradle 将repositories中的google(), mavenCentral() repositori…

linux_driver_day10

作业1 题目&#xff1a; 使用驱动代码实现如下要求 应用程序通过阻塞的io模型来读取number变量的值 number是内核驱动中的一个变量 number的值随着按键按下而改变&#xff08;按键中断&#xff09; 例如 numbero 按下按键 number1&#xff0c;再次按下按键 number0 在按下按…