【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式

news2025/2/3 23:55:12

目录

前言: 

中缀表达式:

 后缀表达式:

中缀表达式转后缀表达式:

后缀表达式计算结果:

总结: 


前言: 

计算机在计算四则运算的时候,由于括号以及运算优先级的存在,并不能够很好的处理所有的运算,为了处理这种情况,我们引入了后缀表达式来优化算法。

中缀表达式:

        中缀表达式是常见的数学表达式表示方法,即操作数位于操作符之间。例如,最常见的中缀算术表达式是 "3 + 4"。中缀表达式有一个显著的特点,就是需要采用运算符优先级来确定表达式的计算顺序。如果表达式中包含不同优先级的运算符,则需要采用约定的优先级规则来计算表达式。在处理中缀表达式时,通常需要将表达式转换为逆波兰表达式或前缀表达式来方便计算。

 后缀表达式:

        逆波兰表达式,又称后缀表达式,是一种数学表达式的表示方法。在逆波兰表达式中,操作符在操作数之后,因此也被称为后缀表示法。例如,表达式 “3 + 4” 在逆波兰表达式中表示为 “3 4 +”。逆波兰表示法可以通过栈来实现,首先将所有操作数入栈,每当遇到一个操作符时,弹出栈顶的两个操作数进行运算,并将运算结果再次压入栈中,直到整个表达式处理完毕。与传统的中缀表达式相比,逆波兰表达式的优点是可以不用考虑运算符优先级的问题。

后缀表达式巧妙地解决了计算机在处理数字运算的时候难处理算数优先级的问题。

中缀表达式转后缀表达式:

转化规则:从左到右遍历中缀表达式中的每个数字和符号,如果是数字就输出,成为后缀表达式的一部分,如果是符号,就判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先于加减),则栈顶元素依次出栈并输出,并把当前符号进栈,一直到最后输出后缀表达式为止。

我们以 9+(3-1)*3+10/2 为例:

 第一步:第一个数字是9,直接输出,第二个是+号,进栈

 第二步:第三个符号是 ' ( ' ,依然是符号,但是是左括号还没有配对,因此进栈,左括号之后是3,为数字直接输出,三后面是-号,进栈。-号后面是数字1,出栈

 第三步:数字1后面是 ‘ )’ ,已经满足我们前面提到的如果是右括号就出栈,因此栈顶依次出栈输出,直到 ‘(’ 出栈为止。

 第四步:‘)’ 后面是 ‘ * ’ 号,此时入栈的和栈顶都是符号,就要进行比较,因为*的优先级比+高,因此入栈,‘*’号后面是数字3,直接输出

 第五步:数字3后面是‘ + ’号,此时栈顶的 ‘ * ’ 要比‘  +  ’的优先级高,因此栈内的元素全部出栈,‘+’号后面的是数字10,直接输出。需要注意的是此处的+并不是9后面的+,而是3后面的+。

 第六步:10后面是‘ / ’号,直接入栈,‘ / ’号后面是2,数字就输出,因为此时这个式子已经结束了,我们就把栈内剩余的符号依次出栈

 这样我们就得到了9+(3-1)*3+10/2的后缀表达式:9 3 1 - 3 * + 10 2 / +

后缀表达式计算结果:

我们仍然以9+(3-1)*3+10/2为例,我们已经得到了他的后缀表达式为9 3 1 - 3 * + 10 2 / +。

计算规则:从左到右遍历表达式的每一个数字和符号,如果是数字就进栈,如果是符号,就把处于栈顶的两个数字出栈,进行运算,并让计算结果再次进栈,一直到最终获得结果。

第一步:前三个都是数字,我们安排进栈。

第二步:1后面是‘ - ’号,我们就将1出栈作为减数,3作为被减数,计算得到结果2,再把2返回到栈里面。再接着让‘ - ’号后面的3进栈。

第三步:3后面是‘ * ’号,我们就再次调出栈内的两个数字相乘,得到结果6,再把6入栈,在后面是‘ + ’号,就把9和6出栈相加,结果为15,再次返回栈中。

 第四步:把后面两个数字10和2压入栈里面,接下来是符号/,就调出栈顶的2和10,10/2=5,再次把5压入栈内

 第五步:最后一个符号是‘ + ’号,我们就把栈顶的两个元素5和15拿出来,进行相加,把得到结果的20入栈,此时式子已经计算完毕,就是20,就让20出栈,作为最终运算结果。

总结: 

         逆波兰表达式是一个用来解决计算机识别运算优先级很好的思路,它是对栈的一次高级运用,学习逆波兰表达式可以让我们对于栈的作用更加深刻。

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

大数据Doris(四十一):Routine Load严格模式和导入案例

文章目录 Routine Load严格模式和导入案例 一、严格模式 二、严格模式导入Kafka数据到Doris Routine Load严格模式和导入案例

【Thunder送书 | 第三期 】「Python系列丛书」

文章目录 前言《Python高效编程——基于Rust语言》《Python从入门到精通》《Python Web深度学习》《Python分布式机器学习》文末福利 | 赠书活动 前言 Thunder送书第三期开始啦!前面两期都是以【文末送书】的形式开展,本期将赠送Python系列丛书&#xff…

下载安装Visual Studio 2017 Community 来编译NIM_PC_DEMO

1、下载vs2017的引导程序 官方并没有为vs2017提供离线安装包,所以我们选择在线安装。 首先我们下载vs2017的引导程序:Visual Studio 2017安装包 包含如下4个文件: vs_Community.exe: 社区版,免费。但是需要登录微软…

第四节 字符串

文章目录 字符串1.1 字符串介绍1.2 字符串的定义1.3 字符串的输入和输出1.3.1 字符串的索引 1.4 字符串切片1.4.1 切片几种写法 1.5 字符串常用函数1.5.1 find()1.5.2 index()1.5.3 扩展知识: rfind()和rindex()1.5.4 count()1.5.5 replace()1.5.6 split()1.5.7 join() 1.6 字符…

C++常用STL容器--list

C常用STL容器--list list基本概念list构造函数list赋值、交换list大小操作list插入、删除list数据获取list反转、排序 list基本概念 功能: 将数据进行链式存储 链表(list) 是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针…

高并发架构设计方法

我们知道,“高并发”是现在系统架构设计的核心关键词。一个架构师如果设计、开发的系统不支持高并发,那简直不好意思跟同行讨论。但事实上,在架构设计领域,高并发的历史非常短暂,这一架构特性是随着互联网,…

Linux之配置网络

目录 Linux之配置网络 网络接口 网络类型符号 类型 设备类型或位置选择 类型 网络连接 网络配置 三种方法 方法1 --- 使用nmtui进行网路配置 方法2 --- 使用nmcli设置 方法3 --- 修改配置文件 方法4 --- cockpit配置示意图 使用ip命令配置临时生效的网络连接 测试网…

chatgpt赋能python:Python收集数据的介绍

Python收集数据的介绍 Python是一个多功能的编程语言,其拥有强大的数据收集和分析功能。为了充分利用Python的数据处理和挖掘功能,一些优秀的数据收集工具被开发出来。在本文中,我们将介绍如何使用Python收集数据,并介绍一些常用…

总结900

目标规划: 月目标:6月(线性代数强化9讲,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日规划 今日已做 1.读六级阅读 2.完成学习通考试(没做计划) 3.阅…

[编程工具]Unity配表导出工具TableExporter1.1

[ 目录 ] 0. 前言1. 属性拓展优化(1)反射获取转化函数 TryParse(2)反射获取EmptyReplace(3)属性类型(4)属性拓展 2. 模板处理(1)替换内容(2&#…

chatgpt赋能python:Python如何放大界面——实用技巧

Python如何放大界面——实用技巧 在Python中,很多时候我们需要放大界面来更清楚的展示内容。这篇文章将介绍Python放大界面的方法。 放大界面的原理 在Python中,放大界面的原理实际上就是改变窗口的大小。我们可以通过改变窗口的尺寸实现放大效果。 …

LuatOS-Air AT应用指南--RNDIS

简介 RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。从而使Windows /Linux可以通过 USB 设备连接网络。 Window系统 window系统支持RNDIS直接用usb连接就可以使用&a…

2023/6/14总结

JS的学习: JavaScript是一种运行在客户端(浏览器)的编程语言,实现人机交互的效果 主要作用: 网页特效表单验证数据交互 JS的组成 ECMAScript 规定了js基础的语法核心知识 Web APIs DOM:操作文档,对页面…

简单的TCP网络程序·线程池(后端服务器)

目录 版本四:线程池 注意事项 文件:Task.hpp -- 任务单独为一个文件 组件:日志修改 新函数:vprintf() 可变参数的提取逻辑 vfprintf()的工作原理 初始化一个va_list 日志准备 获取时间小知识 日志初版 日志启动测试 …

DAY23:二叉树(十三)二叉树的最近公共祖先+二叉搜索树的最近公共祖先

文章目录 236.二叉树的最近公共祖先思路完整版后序遍历的进一步理解为什么左为空右不为空的时候return right这个逻辑是否包含p/q本身就是公共祖先的情况 235.二叉搜索树的最近公共祖先思路关于遍历顺序 递归法最开始的写法debug测试修改版 迭代法最开始的写法为什么最开始这种…

chatgpt赋能python:Python收费介绍

Python收费介绍 什么是Python? Python是一种高级的、解释性、面向对象、纯粹的动态语言,多用于快速应用程序开发、脚本编写、系统管理任务等。它有一个简单直观优美的语法,非常容易学习。 Python的收费形式 Python语言本身是免费的,任何…

chatgpt赋能python:Python如何操作Word文档

Python如何操作Word文档 简介 Python是一种高级编程语言,具有易于学习和使用、高效、可移植性强等优点。相信许多Python开发者都遇到过需要使用Python操作Word文档的情况。本文旨在介绍如何使用Python操作Word文档,使开发者能够方便地实现自己的需求。…

chatgpt赋能python:Python怎么改为中文?

Python怎么改为中文? Python是一种高级编程语言,具有易读性、简单性和可扩展性的特点。它广泛应用于Web开发、数据分析、人工智能等领域。如何将Python改为中文?下面将为您详细介绍。 为什么要将Python改为中文? Python的英文是由…

[读论文][谷歌-12s生成] Speed is all your need

论文简要总结 刚读了下speed is all you need这个论文, https://arxiv.org/pdf/2304.11267.pdf 只是用的SD1.4没有对网络进行改造。 只做了4个改动 1 是对norm采用了groupnorm (GPU shader加速) 2 采用了GELU (GPU shader加速) 3 采用了两种attention优化,是partiti…

C语言之指针详解(2)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 数组指针 数组指针的定义 数组指针是指针?还是数组? 答案是&…