计算逆波兰表达式

news2024/12/23 18:12:57

⭐作者介绍:大二本科网络工程专业在读,持续学习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);
        // 遍历 ls
        for (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://www.coloradmin.cn/o/676294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何搭建Nginx网站服务

目录 一、首先搭建Nginx服务 二、授权的访问控制 第一步 安装依赖包 第二步 生成用户密码认证文件 第三步 修改文件属性和权限 第四步 修改配置文件 第五步 用浏览器测试网站 三、基于IP地址进行限制 第一步 修改配置文件 第二步 用两台设备进行访问测试 四、基于域…

工人规范操作识别系统 yolov5

工人规范操作识别系统通过yolov5python网络模型技术&#xff0c;工人规范操作识别系统对工人的操作进行实时监测&#xff0c;当工人规范操作识别系统检测到工人操作不符合规范时&#xff0c;将自动发出警报提示相关人员采取措施。YOLOv5中在训练模型阶段仍然使用了Mosaic数据增…

HCI-1

3.1 定义 就本文档而言&#xff0c;适用以下术语和定义&#xff1a; 嵌入式安全元件主机&#xff1a;在不可移动安全元件中实现的主机 门&#xff1a;主机内部运行的服务的入口点 主机&#xff1a;运行一项或多项服务的逻辑实体 主机控制器&#xff1a;还负责管理主机网络的…

聊聊 分布式系统 中的补偿机制设计问题

一、关于业务补偿机制 1、什么是业务补偿 2、业务补偿设计的实现方式 二、关于回滚 1、显示回滚 2、回滚的实现方式 三、关于重试 1、重试的使用场景 2、重试策略 3、重试时的注意事项 四、业务补偿机制的注意事项 1、ACID 还是 BASE 2、业务补偿设计的注意事项 我们知…

Langchain+本地大语言模型进行数据库操作的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Navicat Premium 16执行.sql语句中含有汉字乱码造成view和function创建后无法使用

Navicat Premium 16执行.sql语句中含有汉字乱码造成view和function创建后无法使用 如图&#xff0c;从这里选择sql时没法改sql。所以造成我昨天创建view和function时创建好的前面有感叹号没法用。打开一个fun看里面的汉字是问号。 所以要从这里打开&#xff1a; 1. ultraedit…

EMC学习笔记(十)特殊信号的EMC处理(二)

特殊信号的EMC处理&#xff08;二&#xff09; 1.对外接口的EMC设计标准电路1.1 DVI EMC设计标准电路1.2 HDMI接口EMC设计标准电路1.3 LVDS接口EMC设计标准电路1.4 PS2接口EMC设计标准电路1.5 RJ11 EMC设计标准电路1.6 SCART接口EMC设计标准电路1.7 s-video接口EMC设计标准电路…

五个步骤,助你优雅的写好 Controller 层代码!

Controller 层逻辑 普通写法 优化思路 Controller 层逻辑 MVC架构下&#xff0c;我们的web工程结构会分为三层&#xff0c;自下而上是dao层&#xff0c;service层和controller层。controller层为控制层&#xff0c;主要处理外部请求&#xff0c;调用service层。 一般情况下…

6.23黄金是否会跌破1900?多单被套怎么办?

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周四&#xff08;6月22日&#xff09;美市尾盘&#xff0c;现货黄金收报1910美元/盎司&#xff0c;下跌20美元或0.1%&#xff0c;日内最高触及1934.95美元/盎司&…

C++ 面向对象(1)——类 对象

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&a…

Studio One6中文版多少钱?有哪些新功能

Studio One6中文版现在有三个版本&#xff0c;免费版&#xff0c;Artist&#xff0c;Pro版本。下载后是免费版&#xff0c;免费版没有时间限制&#xff0c;但是功能受限。三个版本都支持win/mac系统&#xff0c;而且同时支持5台设备使用&#xff0c;还可以换机使用。 三个版本…

Spring Cloud Day2 Nacos配置管理、Feign远程调用与Gateway服务网关

SpringCloud实用篇02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我…

关闭 MAC 的 Microsoft AutoUpdate 自动更新

不是我说&#xff0c;这玩意儿看着是真不爽&#xff01;&#xff01;而且每天都要弹出来搞事情&#xff01;&#xff01;&#xff01; 我宣布&#xff1a;今天就要永久关闭 MAC 的 Microsoft AutoUpdate 自动更新&#xff01;&#xff01; 像我一样的朋友请举手&#xff01;&am…

Linux学习[17]bash学习深入3---万用字符特殊符号---数据流重导向

文章目录 前言1. 万用字符2. 特殊字符3. 数据流重导向3.1标准输出3.2 标准输入 总结 前言 这篇博客是对之前在查找的时候涉及到的一些通配符(bash里面就是万用字符)的整理。这个为后面管线相关打一个基础。 1. 万用字符 这里整理了一个表格&#xff0c;后面配上相关实例。 符…

定制化你的应用外观:gradio的自定义主题功能

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Axure教程——多项选择器

本文介绍利用Axure里的中继器和动态面板制作一个多选下拉列表 一、效果 预览地址:https://frh0rc.axshare.com 二、功能 1、点击下拉框可以弹出选项&#xff0c;点击选项可以选中选项2、用户可以取消选中 三、制作 1、制作下拉框 拖入一个矩形组件&#xff0c;命名为“下拉框…

C++——指针空值

在良好的C/C编程习惯中&#xff0c;声明一个变量时最好给该变量一个合适的初始值&#xff0c;否则可能会出现不可预料的错误&#xff0c;比如未初始化的指针。如果一个指针没有合法的指向&#xff0c;我们基本都是按照如下方式对其进行初始化&#xff1a; void TestPtr() {int*…

python---案例分析(2)

例5: 使用python生成一个二维码 结果就会显示一个二维码!拿出手机扫描二维码就可以看到make中填写的内容! 例6: 操作excel 使用python计算平均分的情况 首先在自己的pycharm上安装xlrd 必须是上述版本的 安装成功版本后,import一下即可使用 以下是计算100班的平均分 例6: …

后端开发通用

1、前后端开发 项目基于前后端分离的架构进行开发&#xff0c;前后端分离架构总体上包括前端和服务端&#xff0c;通常是多人协作开发 对于后端java工程师 把精力放在设计模式&#xff0c;springspringmvc&#xff0c;linux&#xff0c;mysql事务隔离与锁机制&#xff0c;mongo…

typescript找不到模块‘vue‘ ‘vue-router‘

import { createRouter, createWebHashHistory, createWebHistory } from vue-router 提示&#xff1a;找不到模块“vue-router”。你的意思是要将 "moduleResolution" 选项设置为 "node"&#xff0c;还是要将别名添加到 "paths" 选项中?ts(27…