32.栈的应用补充-表达式求值

news2024/10/7 20:36:43

目录

一. 前缀表达式与后缀表达式

二. 中缀表达式转后缀表达式的手算方法

三. 后缀表达式的手算方法

四. 后缀表达式的机算方法

五. 中缀表达式转前缀表达式的手算方法

六. 前缀表达式的机算方法

七. 中缀表达式转后缀表达式的机算方法

八. 中缀表达式的机算


一. 前缀表达式与后缀表达式

让我们从大家熟悉的表达式说起:((15÷(7 -(1 +1))) × 3)-(2 +(1 +1))。表达式由三个部分组成:操作数、运算符、界限符。其中界限符不可省略,它反映了运算的先后顺序。

某波兰数学家就想:我们能否不用界限符也可以无歧义的表达运算顺序?答案显然是可以的,这就是“波兰表达式”(前缀表达式)和“逆波兰表达式”(后缀表达式)。

前缀表达式:二目运算符+操作数1+操作数2;后缀表达式:操作数1+操作数2+二目运算符

例如:

中缀表达式前缀表达式后缀表达式
a+b+abab+
a+b-c-+abcab+c-
a+b-c*d-+ab*cdab+cd*-

需要说明的是,由于确定中缀表达式的各个运算符的运算顺序不同(例如第3个既可以先算a+b也可以先算c*d),同一中缀表达式转化的前缀表达式和后缀表达式也可能不同。

二. 中缀表达式转后缀表达式的手算方法

  1. 确定中缀表达式中各个运算符的运算顺序;
  2. 选择下一个运算符,按照[左操作数  右操作数  运算符]的方式组合成一个新的操作数;
  3. 如果还有运算符没被处理,就继续2;

例如:前面的中缀表达式各运算符顺序确定如下:

在后缀表达式中,1 1 +先作为一个操作数,然后用7减去,就是7 1 1 + -,再用15除,就是15 7 1 1 + - /,以此类推。

再如,对同一中缀表达式确定不同的运算符顺序:

客观来看两种都正确。但是如果用计算机实现转换,算法需要有确定性,显然前面一种转化运算符的顺序就是运算顺序。更优。

那么如何保证对中缀表达式计算得到后缀表达式的时候,运算符的顺序就是运算顺序呢?显然我们要在确定中缀表达式的运算符运算顺序时不要FreeStyle。这里应当采用所谓“左优先”原则,即:要左边的运算符能先计算,就优先算左边的。

例如:对下面的中缀表达式,确定运算符顺序如下:

三. 后缀表达式的手算方法

方法:从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数。应当注意:两个操作数的左右顺序问题。
 

后缀表达式的特点是:最后出现的操作数被最先计算。

四. 后缀表达式的机算方法

前面说到后缀表达式的特点是:最后出现的操作数被最先计算。这就很完美符合栈的后进先出的特点。接下来讲如何利用栈实现机算。这里栈是操作数栈

  1. 从左往右扫描下一个元素,直到处理完所有元素;
  2. 若扫描到操作数则压入栈,并回到1,否则执行3;
  3. 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到1;
     

以(三)中的第2张图为例:A入栈-B入栈-扫描到+,弹出A和B,执行完A+B后把(A+B)压入栈内-C入栈-D入栈-扫描到*,弹出C和D,执行C*D中把(C*D)压入栈内-E入栈-扫描到/,弹出E和(C*D)【注意先出栈的是右操作数】,执行(C*D)/E后把结果压入栈内-扫描到—,把(C*D)/E和(A+B)弹出,计算(A+B)-(C*D)/E后压入栈内-F入栈-扫描到+,弹出F和(A+B)-(C*D)/E,执行完(A+B)-(C*D)/E+F后压入栈内-扫描结束,这个时候栈内只剩一个元素,它就是最终结果(A+B)-(C*D)/E+F。

五. 中缀表达式转前缀表达式的手算方法

  1. 确定中缀表达式中各个运算符的运算顺序;
  2. 选择下一个运算符,按照「运算符  左操作数  右操作数」的方式组合成一个新的操作数;
  3. 如果还有运算符没被处理,就继续2;

相似的,为了得到唯一表达式,采用“右优先”原则:只要右边的运算符能先计算,就优先算右边的。例如下面的表达式,选择右面的计算顺序可以得到倒序的运算顺序。

六. 前缀表达式的机算方法

此部分和(四)类似,只不过是从右往左扫描:

  1. 从右往左扫描下一个元素,直到处理完所有元素;
  2. 若扫描到操作数则压入栈,并回到1;否则执行3;
  3. 若扫描到运算符,则弹出两个栈顶元素,执行相应运算【注意:先出栈的是左操作数】,运算结果压回栈顶,回到1;

七. 中缀表达式转后缀表达式的机算方法

初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况:

  • 遇到操作数。直接加入后缀表达式。
  • 遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注意:“(”和“)”不加入后缀表达式。
  • 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停止。之后再把当前运算符入栈。

按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。

仍然以(三)中的第2张图为例:初始化一个用来存放运算符的栈。

从前到后扫描中缀表达式:A直接加入后缀表达式—+号入栈—B直接加入后缀表达式—扫描到-,+从栈弹出加入后缀表达式,然后-入栈—C直接加入后缀表达式—*入栈—D直接加入后缀表达式—扫描到/,*从栈弹出加入后缀表达式,然后/入栈—E直接加入后缀表达式—扫描到+,/和-依次从栈弹出并加入后缀表达式,然后+入栈—F直接加入后缀表达式—扫描结束,此时栈内只有一个+,把+输出加入到后缀表达式中。

我们再看一个带括号的中缀表达式:A直接加入后缀表达式—+号入栈—B直接加入后缀表达式—*入栈—(直接入栈—C直接加入后缀表达式—扫描到-,此时运算符栈顶元素是(,所以直接把-入栈—D直接加入后缀表达式—扫描到),此时栈底到栈顶有+,*,(,-,依次从栈顶全部弹出【(不进入后缀表达式】—“-”号入栈—E直接加入后缀表达式—扫描到/,入栈—F直接加入后缀表达式—扫描结束,此时栈内有-,/,依次输出/和-,结束。

八. 中缀表达式的机算

其实就是(七)和(四)的结合。

  1. 初始化两个栈,操作数栈和运算符栈;
  2. 若扫描到操作数,压入操作数栈;
  3. 若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈);
     

仍然以(三)中的第2张图为例:A入操作数栈—+入运算符栈—B入操作数栈—扫描到-,弹出运算符等级相同的+,并从操作数栈弹出A和B,计算A+B后压回操作数栈,最后-号入运算符栈—C入操作数栈—*入运算符栈—D入操作数栈—扫描到/,弹出运算符*,同时弹出C和D,计算C*D后压回操作数栈,最后把/压入运算符栈—E入操作数栈—扫描到+,/和-依次弹出。弹出/时计算C*D/E,压回操作数栈中,然后弹出-时计算A+B-C*D/E,压回操作数栈中,最后把+压入运算符栈—F入操作数栈—扫描结束,把运算符栈清空,每弹出一个运算符弹出两个操作数,这样就是A+B-C*D/E+F。

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

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

相关文章

ElementUI首页导航和左侧菜单静态页面的实现,以及Mockjs和总线的介绍

目录 前言 一. Mock.js 1.1 什么是Mock.js 1.2 Mockjs的安装与配置 1.2.1 安装Mock.js 1.2.2 引入Mock.js 1.3 Mockjs的使用 1.3.1 定义数据测试文件 1.3.2 mock拦截ajax请求 二. 首页导航以及左侧菜单的搭建 2.1 什么是总线 2.2 创建三个vue组件 首页AppMain.vue组…

Learn Prompt- Midjourney Prompt:Prompt 提示语

基础结构​ 一个基本的提示可以简单到一个单词、短语或表情符号。非常短的提示将在很大程度上依赖于 Midjourney 的默认样式。 完整 prompt:可以包括一个或多个图像链接、多个文本短语或单词,以及一个或多个后缀参数 Image Prompts: 可以将图像 URL 添加…

Vue中前端导出word文件

很多时候在工作中会碰到完全由前端导出word文件的需求,因此特地记录一下比较常用的几种方式。 一、提供一个word模板 该方法提供一个word模板文件,数据通过参数替换的方式传入word文件中,灵活性较差,适用于简单的文件导出。需要…

Postgresql源码(113)表达式JIT计算简单分析

相关 《Postgresql源码(85)查询执行——表达式解析器分析(select 11如何执行)》 《Postgresql源码(113)表达式JIT计算简单分析》 1 普通表达式计算 普通表达式计算发生在优化器preprocess_expression中&am…

uni-app 使用 scss 实现推荐标签区域显示效果

效果图 <view class"tag-box"><view class"tag-tip"><view>店家</view><view>推荐</view></view> </view> 方法一 只需修改 $tagFontSize(字体大小) 即可 /* 推荐标签区域 */ .tag-box {$tagFontSize:…

uni-app:实现元素中实现竖直居中

效果展示 前&#xff1a; 后&#xff1a; 未实现前代码 <template><view class"container"><view class"centered-element">我是要被居中的元素</view></view> </template><script>export default {data() {r…

算法与数据结构-堆

文章目录 什么是堆如何实现一个堆&#xff1f;如何基于堆实现排序&#xff1f;1. 建堆2. 排序 什么是堆 堆是一种特殊的树&#xff0c;特殊点有二&#xff0c;如下&#xff1a; 堆是一个完全二叉树&#xff1b;堆中每一个节点的值都必须大于等于&#xff08;或小于等于&#…

【Vue】Mock.js介绍和使用与首页导航栏左侧菜单搭建

目录 一、Mock.js 1.1 mockjs介绍 1.2 mock.js安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js的使用 1.3.1 准备模拟数据 1.3.2 定义拦截路由 1.3.3 测试 二、首页导航栏左侧菜单搭建 2.1 自定义界面组件 (完整代码) 2.2 配置路由 2.3 组件显示折叠和…

uniapp ui安装

安装 ui uni-app官网 (dcloud.net.cn) 安装 pages.js配置 使用 <template><view class"bg"><div class"title"><uni-data-selectv-model"value":localdata"range"change"change">asa</uni-da…

GiliSoft USB Lock v10.5.0 电脑USB设备管控软件

网盘下载 软件功能特性 禁止USB / SD驱动器 禁用从USB / SD磁盘读取&#xff0c;禁用写入USB / SD磁盘&#xff0c;阻止非系统分区。它不允许任何类型的USB / SD驱动器访问您的计算机&#xff0c;除非您授权它或它已在可信设备白名单。 CD锁&#xff0c;块媒体和蓝光光盘 禁用…

代码阅读分析神器-Scitools Understand

这里写目录标题 前言概要功能介绍1.代码统计2.图形化分析3.代码检查 使用方法下载及使用 前言 作为一名程序员&#xff0c;阅读代码是一个必须要拥有的能力&#xff0c;但无奈很多代码逻辑嵌套非常多&#xff0c;看起来非常吃力&#xff0c;看了那段逻辑就忘记了刚才的逻辑&am…

Spring实例化源码解析之ComponentScanAnnotationParser(四)

上一章我们分析了ConfigurationClassParser&#xff0c;配置类的解析源码分析。在ComponentScans和ComponentScan注解修饰的候选配置类的解析过程中&#xff0c;我们需要深入的了解一下ComponentScanAnnotationParser的parse执行流程&#xff0c;SpringBoot启动类为什么这么写&…

01 MIT线性代数-方程组的几何解释

一, 线性方程的几何图像 The geometry of linear equations 线性代数的基本问题就是解n元一次方程组 eg&#xff1a;二元一次方程组 矩阵形式: 系数矩阵(coefficient matrix): 未知数向量: 线性方程组简记为Axb 二, 行图像 Row Picture 行图像遵从解析几何的描述&#xff0…

李宏毅hw-10 ——adversarial attack

一、查漏补缺&#xff1a; 1.关于glob.glob的用法&#xff0c;返回一个文件路径的 列表&#xff1a; 当然&#xff0c;再套用1个sort&#xff0c;就是将所有的文件路径按照字母进行排序了 2.relpath relative_path返回相对于基准路径的相对路径的函数 二、代码剖析&#xff…

Pytorch之AlexNet花朵分类

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 目录 一、AlexNet 1.卷积模块 2.全连接模块 3.AlexNet创新点 1.更深的神经…

深度学习技巧应用28-强化学习的原理介绍与运用技巧实践

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用28-强化学习的原理介绍与运用技巧实践, 强化学习是一种机器学习的子领域,它使得一个智能体在与环境的交互中学习如何行动以最大化某种数值奖励信号。强化学习模型的关键特性是它的试错搜索和延迟奖励。 一、强化学习…

React 全栈体系(十四)

第七章 redux 六、react-redux 7. 代码 - react-redux 数据共享版 7.1 效果 7.2 App /* src/App.jsx */ import React, { Component } from "react"; import Count from "./containers/Count"; import Person from "./containers/Person";ex…

opencv dnn模块 示例(17) 目标检测 object_detection 之 yolo v5

在前文【opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4】介绍的yolo v4后的2个月&#xff0c;Ultralytics发布了YOLOV5 的第一个正式版本&#xff0c;其性能与YOLO V4不相伯仲。 文章目录 1、Yolo v5 和 Yolo v4 的区别说明1.1、Data Augmentation - 数据增强1…

Shader中的渲染路径LightMode

文章目录 前言一、在Shader中如何区分不同的渲染路径1、Pass Tag2、LightMode的不同类型 二、在Frame Debug下查看渲染路径之间的区别1、在摄像机可以切换渲染路径2、前向渲染路径3、延迟渲染路径4、顶点照明渲染路径&#xff08;可以看出效果很差&#xff09; 前言 Shader中的…

网络竞品分析:用爬虫技术洞悉竞争对手

概述 网络竞品分析是指通过互联网收集、分析和比较竞争对手的信息&#xff0c;以了解他们的优势和劣势&#xff0c;找出自己的差距和机会&#xff0c;制定有效的竞争策略。网络竞品分析涉及的信息包括竞争对手的产品、价格、渠道、营销、用户反馈等方面。爬虫技术是一种自动化…