当前位置: 首页 > news >正文

前缀表达式(波兰式)和后缀表达式(逆波兰式)的计算方式

缀是指操作符。

1. 前缀表达式(波兰式)

(1)不需用括号;
(2)不用考虑运算符的优先级;
(3)操作符置于操作数的前面。(如 + 3 2 )

1.1 中缀表达式转前缀表达式

中缀表达式转换成前缀表达式和后缀表达式 ——— 飞鸟快跑

1.1.1 加括号法/直接法

中缀表达式:a+b * c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号
式子变成:((a+(b * c))-(d+e))
第二步:把运算符号移动到对应的括号前面
则变成:-( +(a * (bc)) +(de))
把括号去掉:-+a*bc+de 前缀式子出现

1.1.2 入栈法

C++:前缀、中缀、后缀表达式互相转换详解 ——小米内推官_AngelDg

遵循以下步骤:

  1. 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
  2. 从右至左扫描中缀表达式;
  3. 遇到操作数时,将其压入S2;
  4. 遇到运算符时,比较其与S1栈顶运算符的优先级:
    4.1 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
    4.2 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
    4.3 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较
  5. 遇到括号时:
    5.1 如果是右括号“)”,则直接压入S1;
    5.2 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃
  6. 重复步骤(2)至(5),直到表达式的最左边;
  7. 将S1中剩余的运算符依次弹出并压入S2;
  8. 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

1.1.3 遍历树法

将中缀表达式写作表达式树,对其进行先前序遍历得到前缀表达式。

1.2 前缀表达式 逆向求解 中缀表达式

前缀/中缀/后缀----表达式之间的相互转换 —— DioDid

-+1*+2345

1.2.1 从左到右逐个比较

思路: 递归,碰到操作符就进入递归。

  1. 从右往左扫描先碰到+号,取+号后面两个操作数:2,3 得到:2+3.
  2. 继续往左扫碰到*号,取2+3和 4 得到:(2+3)*4
  3. 继续往左扫碰到+号,取1和(2+3)*4得到:1+(2+3)*4
  4. 继续往左扫碰到-号,取1+(2+3)*4和5得到:1+(2+3)*4-5

1.2.2 使用前缀表达式扫描推栈法

1.2 前缀表达式计算方式一

前缀表达式 ——百度百科

以二元运算为例,计算过程为:
(1)从左至右读入表达式;
(2)遇到一个操作符后跟随两个操作数时,则计算之
(3)将结果作为操作数替换这个操作符和两个操作数;
(4)重复此步骤,直至所有操作符处理完毕。

因为在正确的前缀表达式中,操作数必然比操作符多一个,所以必然能找到一个操作符符合运算条件;
而替换时,两个操作数和一个操作符替换为一个操作数,所以减少了各一个操作符和操作数,仍然可以迭代运算直至计算整个式子。
多元运算也类似,从左至右,遇到足够的操作数即产生运算,迭代直至完成。
迭代结束的条件由表达式的正确性来保证。

1.3 前缀表达式计算方式二

前缀表达式(波兰表达式)的计算 ———lexingsen

(1)从右至左遍历表达式。
(2)遇到数字直接入栈。
(3)遇到运算符,取出两个数字,第一个作为操作数,第二作为被操作数,执行相应的运算。将运算的结果继续入栈。
(4)当表达式遍历完时,此时栈顶元素即为计算结果。

2. 后缀表达式(逆波兰式)

(1)不需用括号;
(2)无需考虑操作符的优先级;
(3)把操作数写在前面,把操作符写在后面。(如 3 2 +)

2.1 中缀表达式转后缀表达式

《数据结构》:中缀表达式转后缀表达式 + 后缀表达式的计算 —— Amentos

中缀表达式转换成前缀表达式和后缀表达式 ——— 飞鸟快跑

2.1.1 加括号法/直接法

中缀表达式 :a+bc-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号~
式子变成:((a+(b
c))-(d+e))
第二步:把运算符号移动到对应的括号后面
则变成:((a(bc)* )- (de)+ )-
把括号去掉:a b c * - d e + - 后缀式子出现

2.1.2 入栈法

C++:前缀、中缀、后缀表达式互相转换详解 ——小米内推官_AngelDg

遵循以下步骤:

  1. 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
  2. 从左至右扫描中缀表达式;
  3. 遇到操作数时,将其压入S2;
  4. 遇到运算符时,比较其与S1栈顶运算符的优先级:
    4.1 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
    4.2 比栈顶高,也将运算符压入S1 (注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
    4.3 比栈顶低或相同,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
  5. 遇到括号时:
    5.1 如果是左括号“(”,则直接压入S1;
    5.2 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
    可以想象成“(”比任何运算符都高,“)”比任何运算符都低。
  6. 重复步骤(2)至(5),直到表达式的最右边;
  7. 将S1中剩余的运算符依次弹出并压入S2;
  8. 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。

2.1.3 遍历树法

将中缀表达式写作表达式树,对其进行后序遍历得到后缀表达式。

2.2 后缀表达式 逆向求解 中缀表达式

1 2 3 + 4* 5 - +

2.2.1 从左到右逐个比较

基本思路和上面的一样: 递归,碰到操作符就进入递归

  1. 从左往右扫描先碰到+号,取+号前面两个操作数:2,3 得到:2+3.
  2. 继续往右扫碰到*号,取2+3 和 4 得到:(2+3)*4
  3. 继续往右扫碰到-号,取(2+3)*4和5得到:(2+3)*4-5
  4. 继续往右扫碰到+号:取(2+3)*4-5和1得到:1+(2+3)*4-5

2.2.2 使用后缀表达式扫描推栈法

2.3 后缀表达式计算方式

后缀(逆波兰)表达式的计算以及中缀转后缀的方法 —— 椰椰椰耶

按操作符从左到右出现的顺序依次执行(不考虑运算符之间的优先级)
这对于计算机而言是比较简单的结构。

(1)从左到右遍历表达式。
(2) 如果当前字符为变量或者为数字,则压栈;
(3)如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈。
(4)最后当表达式扫描完后,栈顶元素(也只会剩下一个元素)就是结果。

注意与前缀表达式(波兰式)第二种计算方式的相同点及共同点。

3. 中缀表达式

(1)操作符位于两个运算数中间。
(2)计算时要综合考虑操作符的优先级和括号

如 5*(2+1) ,虽然 * 的优先级高于 + ,但括号的存在表示应优先执行括号内的 + 运算。

3.1 中缀表达式计算方式

《数据结构(C语言版)第二版》第三章-栈和队列(3.6)—— 3.6.3 表达式求值

《数据结构(C语言版)第二版》P79、P80

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 遍历树法获得中缀表达式

将中缀表达式写作表达式树,对其进行中序遍历得到中缀表达式。

注意:
中序遍历可以用来表示一个表达式的结构,但它本身不包含足够的信息来完全确定运算符的优先级和结合性。
如果需要根据一个中序序列重建表达式树并正确地计算表达式,需要额外的信息来指导如何处理运算符。

如对表示表达式 a+b*(c-d)一e/f 的二叉树进行中序遍历,只能得到的中序序列为 a + b * c - d - e/f,显然与原表达式的计算顺序不同,要额外加括号规定运算顺序。

相关文章:

前缀表达式(波兰式)和后缀表达式(逆波兰式)的计算方式

缀是指操作符。 1. 前缀表达式(波兰式) (1)不需用括号; (2)不用考虑运算符的优先级; (3)操作符置于操作数的前面。(如 3 2 ) 1.1 中…...

智能井盖管理系统:城市窨井的井下“保镖”

随着城市化进程的加速,城市的生命线基础设施面临着越来越多的挑战。其中,旭华智能智能井盖传感器技术的发展为提升城市基础设施的安全性和管理效率提供了新的解决方案。它专门用于监控市政窨井、燃气井、供水井内的积水状况以及井盖状态,以增…...

vue3-环境变量-JavaScript-axio-基础使用-lzstring-字符串压缩-python

文章目录 1.Vue3环境变量1.1.简介1.2.全局变量的引用1.3.package.json文件 2.axio2.1.promise2.2.安装2.3.配置2.3.1.全局 axios 默认值2.3.2.响应信息格式 2.4.Axios的拦截器2.4.1.请求拦截器2.4.2.响应拦截器2.4.3.移除拦截器2.4.4.自定义实例添加拦截器 3.lz-string3.1.java…...

ubuntu下载docker依赖包

Ubuntu下载docker依赖包 ​ 公司对外客户一直偏向对安全性要求较高,因此在外部署服务得时候,安装docker是一件极为重要得事情,之前得服务器得系统是centos7。在上一家公司的时候,已经把docker所需得rpm包已经集成打包好了。并且d…...

java面向对象进阶进阶篇--《JDK8,JDK9接口中新增的方法、接口的应用、适配器设计模式》

个人主页→VON 收录专栏→java从入门到起飞 接口→接口和接口与抽象类综合案例 一、JDK8接口中新增的方法 在JDK 8中,接口新增了几个重要的特性和方法,其中最显著的是默认方法(Default Methods)和静态方法(Static Met…...

15.2 zookeeper java client

15.2 zookeeper java client 1. Zookeeper官方1.1 依赖1.2 Zookeeper客户端连接测试1.3***************************************************************************************1. Zookeeper官方 1.1 依赖 <!-- 集成方式一:官方集成zookeeper依赖 --><dependenc…...

素材管理太繁琐?有这一个就够了!

引言&#xff1a; 在创意行业中&#xff0c;素材管理一直是设计师们的痛点。从灵感的捕捉到作品的完成&#xff0c;每一步都离不开素材的积累与整理。然而&#xff0c;传统的素材管理方式往往繁琐且效率低下&#xff0c;让人头疼不已。今天&#xff0c;我要介绍的这款智能素材管…...

KubeSphere 部署向量数据库 Milvus 实战指南

作者&#xff1a;运维有术星主 Milvus 是一个为通用人工智能&#xff08;GenAI&#xff09;应用而构建的开源向量数据库。它以卓越的性能和灵活性&#xff0c;提供了一个强大的平台&#xff0c;用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索&#xff0c;并以…...

前端canvas——贝塞尔曲线

曲线之美&#xff0c;不在于曲线本身&#xff0c;而在于用的人。 所以就有了这期贝塞尔曲线。 新规矩&#xff0c;先上个GIT。 效果图 开局一张图&#xff0c;代码全靠编。 代码 画骨 先想着怎么画一个心形吧&#xff0c;等你想好了&#xff0c;就知道怎么画了。 首先就还…...

Elasticsearch模糊查询之Wildcard

{“wildcard” : { “LPR.keyword” : { “wildcard” : “${Keyword}”} }},你的示例中使用了 wildcard 查询&#xff0c;它适用于模糊搜索&#xff0c;允许使用通配符&#xff08;* 和 ?&#xff09;来匹配字段值。你使用了 keyword 子字段来确保精确匹配&#xff0c;这是一…...

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…...

Nginx服务 rewrite、proxy_pass 用rewrite去除URL中的特定参数

Nginx 是一个高性能的开源反向代理服务器&#xff0c;可以用于处理跨域请求、负载均衡和缓存等功能。在本文中&#xff0c;我们将介绍如何使用 Nginx 配置文件来实现反向代理。 我们可以实现跨域请求的处理&#xff0c;同时保护用户的隐私和安全。此外&#xff0c;Nginx 还…...

RocketMQ事务消息机制原理

RocketMQ工作流程 在RocketMQ当中&#xff0c;当消息的生产者将消息生产完成之后&#xff0c;并不会直接将生产好的消息直接投递给消费者&#xff0c;而是先将消息投递个中间的服务&#xff0c;通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…...

【C++】选择结构- 嵌套if语句

嵌套if语句的语法格式&#xff1a; if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数&#xff0c;根据分…...

scrapy解决管道阻塞问题采用threadpool库线程池+twisted同步语法异步编程

实现方法&#xff1a;process_item和download任务函数像下面编写即可&#xff0c;其他管道像往常一样写法 import time import threadpool import random from twisted.internet import deferclass VideoPipeline:def __init__(self):self.pool threadpool.ThreadPool(10) # …...

Axure RP:打造动态交互的大屏可视化设计利器

Axure大屏可视化是指使用Axure RP这款原型设计工具来创建具有视觉冲击力和数据展示功能的大屏幕界面。Axure以其强大的交互设计和丰富的组件库&#xff0c;成为了实现大屏可视化的重要工具之一。以下是对Axure大屏可视化的详细阐述&#xff1a; 一、Axure在大屏可视化中的优势 …...

“八股文”在实际工作中是助力、阻力还是空谈

目录 1.概述 1.1.对实际工作的助力 1.2.存在的问题 2.“八股文”对招聘过程的影响 2.1.“八股文”在筛选候选人时的作用 2.2.面试中的比重及其合理性 2.3.如何平衡“八股文”与实际编程能力的考察 3.“八股文”在日常工作中的实用价值 3.1.在团队协作环境中进行有效沟…...

项目开发:@ControllerAdvice注解的基本应用

目录 简介基本用法全局异常处理全局拦截器全局数据绑定 注解参数1.value(): String[]2.basePackages(): String[]3.basePackageClasses(): Class<?>[]4.assignableTypes(): Class<?>[]5.annotations(): Class<? extends Annotation>[] 三.注解组成总结 简…...

Jmeter三种方式获取数组中多个数据并将其当做下个接口参数入参【附带JSON提取器和CSV格式化】

目录 一、传统方式-JOSN提取器获取接口返回值 1、接口调用获取返回值 2、添加JSON提取器 3、调试程序查看结果 4、添加循环控制器 5、设置count计数器 6、添加请求 7、执行请求 二、CSV参数化 1、将结果写入后置处理程序 2、设置循环处理器 3、添加CSV文件 4、设置…...

C++入门基础:C++中的循环语句

循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用&#xff0c;比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈&#xff0c;有时候一不小心会构成死循环或者…...

18分钟攻破GitHub:TeamPCP供应链攻击全技术解析与防御新范式

摘要 2026年5月18日&#xff0c;威胁组织TeamPCP通过一条精心设计的多级供应链攻击链&#xff0c;仅用18分钟就成功入侵全球最大代码托管平台GitHub的内部系统&#xff0c;窃取了约3800个核心私有仓库&#xff0c;涵盖Copilot、CodeQL、GitHub Actions等所有关键产品的源代码。…...

AI大模型学习顺序_七步掌握大模型精髓:从入门到精通的进阶秘籍!

本文以“七层关系”为框架&#xff0c;系统地阐述了学习大模型的最佳路径。从基础概念入手&#xff0c;逐步深入到模型架构、训练技巧、应用场景等核心内容&#xff0c;旨在帮助读者构建完整的知识体系&#xff0c;最终实现从入门到精通的全面提升。按“七层关系”学大模型&…...

FactoryBluePrints:戴森球计划终极蓝图仓库,5步打造高效自动化工厂

FactoryBluePrints&#xff1a;戴森球计划终极蓝图仓库&#xff0c;5步打造高效自动化工厂 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 你是否曾在戴森球计划中花费数小…...

2026大模型技术全景:从“写代码“到“做工程“

2026大模型技术全景&#xff1a;从"写代码"到"做工程"大模型技术正从"炫酷玩具"迈向"核心生产力工具"。本文从技术进展、关键方向、应用场景到未来趋势&#xff0c;全面梳理2026年大模型技术全景。一、引言 2026年&#xff0c;大模型技…...

Nodejs后端服务接入Taotoken OpenAI兼容API的详细步骤

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Nodejs后端服务接入Taotoken OpenAI兼容API的详细步骤 本文面向使用Node.js构建后端服务的开发者&#xff0c;旨在提供一份清晰的指…...

如何在3分钟内完成Zotero插件市场终极安装指南

如何在3分钟内完成Zotero插件市场终极安装指南 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing and installing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 你是否曾为寻找合适的Zotero插件而…...

零基础30天掌握渗透测试实战路径

1. 别被“渗透测试”四个字吓住&#xff1a;它本质是“合法授权的系统体检”很多人第一次看到“渗透测试”这个词&#xff0c;脑子里立刻浮现出黑客电影里飞速滚动的代码、黑底绿字的终端、戴着兜帽在咖啡馆敲键盘的神秘人——这种刻板印象害了不少想入门的朋友。我带过三十多个…...

【能力进阶】测试工程师必须了解的 Tokenization(分词器)避坑指南

写作日期:2026年5月 适用读者:后端/算法测试工程师、AI产品测试、LLM应用QA 1 为什么测试工程师必须关注分词器? 2 竞品对比:同一句话,不同模型差出一个量级 2.1 「中文税」到底有多重 2.2 各模型中文分词效...

如何通过Play Integrity API完整检测Android设备安全状态

如何通过Play Integrity API完整检测Android设备安全状态 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-checker-app 在移动应用生…...

大学生如何学习AI智能体?从零基础到OPC一人公司

掌握AI智能体能力&#xff0c;是大学生未来就业和创业的核心竞争力。 在AI智能体时代&#xff0c;普通人若能借助模型、智能体和自动化工具完成从任务交付到产品落地的闭环&#xff0c;将成为稀缺人才。智能体来了旗下的OPC中国&#xff0c;为大学生提供了完整的学习、实训和就…...