当前位置: 首页 > 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;有时候一不小心会构成死循环或者…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...