计算逆波兰表达式

article/2025/9/19 9:09:14

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现
⭐码云地址超链接(Gitee):这里存放我学习数据结构过程的全部代码

目录

  • 1、计算步骤
  • 2、具体操作
  • 3、代码实现
    • 3.1、得到逆波兰表达式
    • 3.2、存入list
    • 3.3、开始计算

在这里插入图片描述

⭐如果不太了解三种数学表达式,可以查看我这篇文章:前缀表达式、中缀表达式、后缀表达式

1、计算步骤

逆波兰表达式(Reverse Polish Notation,RPN)是一种用于表示和计算数学表达式的方法,它通过使用后缀表示法而不是传统的中缀表示法。计算逆波兰表达式的步骤如下:

  1. 创建一个空的栈,用于存储操作数和中间结果。

  2. 从左到右扫描逆波兰表达式的每个元素。

  3. 如果当前元素是一个操作数(即数字),将其压入栈中。

  4. 如果当前元素是一个操作符(如加法、减法、乘法、除法等),则从栈中弹出两个操作数。

  5. 对弹出的两个操作数执行相应的操作,并将结果压入栈中。

  6. 重复步骤 3-5,直到扫描完整个逆波兰表达式。

当扫描结束后,栈中只剩下一个元素,即为最终的计算结果。

2、具体操作

计算表达式 “123+4*+5-” 的逆波兰表达式:

  1. 创建一个空栈。
  2. 从左到右扫描表达式的每个元素。
    ○ 遇到 1,将其压入栈中。
    ○ 遇到 2,将其压入栈中。
    ○ 遇到 3,将其压入栈中。
    ○ 遇到 + 操作符,从栈中弹出 3 和 2,执行加法操作得到 5,并将结果 5 压入栈中。
    ○ 遇到 4,将其压入栈中。
    ○ 遇到 * 操作符,从栈中弹出 4 和 5,执行乘法操作得到 20,并将结果 20 压入栈中。
    ○ 遇到 + 操作符,从栈中弹出 20 和 1,执行加法操作得到 21,并将结果 21 压入栈中。
    ○ 遇到 5,将其压入栈中。
    ○ 遇到 - 操作符,从栈中弹出 5 和 21,执行减法操作得到 16,并将结果 16 压入栈中。
  3. 扫描完整个表达式后,栈中只剩下一个元素 16,即为最终的计算结果。

3、代码实现

3.1、得到逆波兰表达式

这部分请查看我另外一篇文章:中缀表达式转后缀表达式

3.2、存入list

public static String postfixExpressionToList(Stack<Object> IntermediateResultStack) {Object[] postfixExpression = new Object[IntermediateResultStack.getMaxSize()];List<Object> list = new ArrayList();StringBuilder PostfixExpression_resultBuilder = new StringBuilder();for (int i = 0; i < IntermediateResultStack.getMaxSize(); i++) {if (IntermediateResultStack.getTop() != -1) {postfixExpression[i] = IntermediateResultStack.pop();}}for (int i = postfixExpression.length - 1; i >= 0; i--) {if (postfixExpression[i] != null) {PostfixExpression_resultBuilder.append(postfixExpression[i]);list.add(postfixExpression[i]);}}System.out.println(list);return PostfixExpression_resultBuilder.toString();
}

3.3、开始计算

package stack;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** @author 逐梦苍穹* @date 2023/6/23 10:03*/
public class CountPostfixExpression {public static void main(String[] args) {String PostfixExpression = "123+4*+5-";//[1, 2, 3, +, 4, *, +, 5, -]List<String> list = new ArrayList<>(Arrays.asList("1", "2", "3", "+", "4", "*", "+", "5", "-"));int calculate = calculate(list);System.out.println("PostfixExpression(" + PostfixExpression + ") = " + calculate);}//完成对逆波兰表达式的运算/**  1)从左至右扫描,将1和2和3压入堆栈;2)遇到+运算符,因此弹出3和2(3为栈顶元素,2为次顶元素),计算出3+2的值,得5,再将5入栈;(此时栈内的元素:154*+5-)3)将5入栈;4)遇到4,把4入栈5)接下来是×运算符,因此弹出4和5,计算出5 * 4=20,将20入栈;6)遇到+,弹出1和20,计算1+20=21,入栈7)遇到5,将5入栈;8)最后是-运算符,计算出21-5的值,即16,由此得出最终结果*/public static int calculate(List<String> ls) {// 创建给栈, 只需要一个栈即可Stack<String> stack = new Stack<String>(15);// 遍历 lsfor (String item : ls) {// 这里使用正则表达式来取出数if (item.matches("\\d+")) { // 匹配的是多位数// 入栈stack.push(item);} else {// pop出两个数,并运算, 再入栈int num2 = Integer.parseInt((String) stack.pop());int num1 = Integer.parseInt((String) stack.pop());int res = 0;if (item.equals("+")) {res = num1 + num2;} else if (item.equals("-")) {res = num1 - num2;} else if (item.equals("*")) {res = num1 * num2;} else if (item.equals("/")) {res = num1 / num2;} else {throw new RuntimeException("运算符有误");}//把res 入栈stack.push("" + res);}}//最后留在stack中的数据是运算结果return Integer.parseInt((String) stack.pop());}}

http://chatgpt.dhexx.cn/article/wtJZBU4q.shtml

相关文章

JavaScript逆波兰表达式求值

逆波兰表达式简介 逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。 逻辑提…

【题解】 逆波兰表达式

今天随机选题选到了这道题&#xff0c;这题比较经典&#xff0c;包含的知识点也不少&#xff0c;就在此与大家分享一下我的思路。 原题目&#xff1a;MFOJ P753-逆波兰表达式​​​​​ 题目描述 逆波兰记法中&#xff0c;操作符置于操作数的后面。例如表达“三加四”时&…

【JAVA】---逆波兰表达式

一. 逆波兰表达式的介绍 逆波兰表达式又称为后缀表达式&#xff0c;代表的含义是操作数在前&#xff0c;运算符在后。 比如&#xff1a;12&#xff0c;用逆波兰表达式来写的话&#xff0c;就是12。 而12这种写法称为中缀表达式&#xff0c;即运算符在两个操作数之间&#xff0c…

逆波兰表达式题解

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式&#xff0c;例如普通的表达式2 3的逆波兰表示法为 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系&#xff0c;也不必用括号改变运算次序&#xff0c…

C++题解 | 逆波兰表达式相关

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C/C相关题解 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录 &#x1f307;前言…

(详细图解) 逆波兰表达式

下面给出图解: 下面给出代码: class Solution { public:int evalRPN(vector<string>& tokens) {stack<int> st;//循环遍历表达式 范围forfor(const auto& str : tokens) {if(str "" || str "-"|| str "*" || str &quo…

详解逆波兰表达式的转换与表达式求值

对于计算一个算式 如 : 3*(56)-2 这种算式叫做中缀表达式, 人们看着会比较方便, 如果用计算机直接计算会很麻烦,所以要把中缀表达式变为计算机易于理解的后缀表达式来计算. 后缀表达式又叫逆波兰表达式, 把运算量写在前面, 把运算符写在后面, 并且可以去掉括号 如 ab 变为 …

逆波兰表达式(后缀表达式)C++实现

1 何谓逆波兰表达式 逆波兰表达式又称为后缀表达式&#xff0c;是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法。 例如&#xff1a; 1 2 3&#xff0c;转换为逆波兰表达式&#xff1a;1 2 3 。 1 2 * 3&#xff0c;转换为逆波兰表达…

将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值。

要求&#xff1a;设计一个算法&#xff0c;将一般算术表达式转化为逆波兰表达式&#xff0c;并求逆波兰表达式的值。 实现思路 获取一个中缀表达式将表达式转换为后缀表达式计算后缀表达式的结果 中缀表达式转换为后缀表达式的几个关键部分 假如不是运算符&#xff0c;则输…

波兰表达式与逆波兰表达式

文章目录 波兰表达式逆波兰表达式波兰表达式计算逆波兰表达式计算总结 常见的算术表达式&#xff0c;称为中缀表达式&#xff0c;例如&#xff1a; 5 ( 6 – 4 / 2 ) * 3波兰表达式 波兰表达式也称为前缀表达式&#xff0c;以上面的例子为例&#xff0c;其波兰表达式为&…

逆波兰表达式

逆波兰表达式在维基百科上的解释&#xff1a;逆波兰表示法&#xff08;Reverse Polish notation&#xff0c;RPN&#xff0c;或逆波兰记法&#xff09;&#xff0c;是一种是由波兰数学家扬武卡谢维奇1920年引入的数学表达式方式&#xff0c;在逆波兰记法中&#xff0c;所有操作…

【数据结构】-------逆波兰表达式(C++)

文章目录 逆波兰表达式讲解正常表达式转换到逆波兰表达式栈操作逆波兰表达式的原理多位数压入栈操作代码例题 逆波兰表达式讲解 逆波兰表达式-----是数据结构的应用&#xff0c;你要单独说讨论它的话没有多大意义&#xff0c;如果我们结合数据结构中的栈来讲解的话&#xff0c…

什么是逆波兰表达式?

文章目录 1. 题目描述2. 解题思路3. 动图演示4. 代码实现 1. 题目描述 2. 解题思路 逆波兰表达式由波兰的逻辑学家卢卡西维兹提出&#xff0c;它的特点是&#xff1a;没有括号&#xff0c;运算符总是放在和它相关的操作数之后。因此&#xff0c;逆波兰表达式也称后缀表达式&am…

微信网页开发中授权headimgurl有的为空

微信网页开发授权&#xff0c;有的用户头像链接为空。 微信开发文档&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html headimgurl用户头像&#xff0c;最后一个数值代表正方形头像大小&#xff08;有0、46、64、…

微信开发——网页授权

微信开发——网页授权 前期准备前端后端 前期准备 ①微信客户端中访问第三方页面&#xff0c;公众号可以通过网页登陆授权&#xff0c;获取微信用户的基本信息&#xff08;头像、昵称等&#xff09;&#xff0c;实现业务逻辑。一切按照官方文档说明开发。 ②安装微信开发者工具…

微信公众号微信网页开发网页授权/回调自定义参数问题处理方法。

微信公众号页面授权回调自定义参数问题 我们知道微信页面回调接口&#xff0c;获得用户信息后&#xff0c;回调地址&#xff1a; redirect_uri&#xff1a;授权后重定向的回调链接地址&#xff0c; 请使用 urlEncode 对链接进行处理。 授权后跳转回页面&#xff1a; redirec…

微信网页开发--分享接口

流程 关于流程&#xff0c;在上一篇中已经有图介绍: 微信文档 微信JS-SDK说明文档 JSSDK使用步骤 首先确保已经获取了相关权限 步骤一&#xff1a;绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注&#xff1a;登录后…

微信网页开发样式库的使用

一、WeUI 是什么 WeUI 是一套同微信原生视觉体验一致的基础样式库&#xff0c;由微信官方设计团队为微信内网页和微信小程序量身设计&#xff0c;令用户的使用感知更加统一。在微信网页或小程序中使用 WeUI&#xff0c;有如下优势&#xff1a; 1. 同微信客户端一致的视觉效果…

微信网页开发(10)--扫一扫功能接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 背景2. 代码3. 测试 1. 背景 我们可以在微信网页调起扫一扫功能&#xff0c;可以识别一维码、二维码的内容&#xff0c;然后根据扫码结果实现我们的业务逻辑。 2. 代码 代码如下&am…

微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自动登录业务系统)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权…