栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

【0】README

0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现;
0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理清它的原理),故源代码中 考虑的数字是一位整型数(因为如果是两位数及以上的话,还涉及到字符串转int类型,虽然,我们没有加入其功能,但是还是定义了相关的函数,给出了接口的,朋友需要的话,可以自行实现)、还有就是 运算符的话,只考虑到了 *、+、(、),同样,如果朋友些需要的话,可以自行增加case 语句 or if 语句添加上即可;
0.3) 需要注意的是,操作数operand 和 操作符(运算符)operator 只能用char 类型将它们区分开;在中缀转后缀的过程中,只能用char类型的空间来存储它们的ASCII值(当然int空间也可以,也是存储它们的ASCII值);
0.4) 在计算后缀的过程中,需要把数字字符串(如123,它的ASCII序列为 49 50 51)转为int 类型或其他数据类型,所以本文中的源代码只处理 一位 整数的情况;朋友需要的话,自行添加;
0.5) 对于写算法代码的感悟, 重在理清算法原理 or idea,不要把输入输出的各种情况都考虑到, 那样很累,很烧精力,影响学习进度;其实只要实现了其 简单版本,实现复杂情况 也不是那样难;总之一句话,学习期间,我们不追求完美,一切从简,重在理解算法idea;
0.6) 题外话,曾经看到一位前辈说,栈有两种实现方法——数组实现+链表实现, 说在工作中,栈的数组实现应用的比较多,链表实现基本不怎么用,所以,你知道侧重点在哪里了;(当然可以 看看 栈的链表实现 了解了解)


【1】中缀到后缀的转换

1.1)此方法需要遵循几个规则(Rule):

  • R1)如果读入操作数,则直接放入输出字符串;
  • R2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低或两者相等的话,则需要将栈顶的运算符先放入输出字符串, 然后再将刚读入的运算符压栈;
  • R3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低;
  • R4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串;
  • R5)顺序读完表达式,如果栈中还有操作符,则弹出,并放入输出字符串;

1.2)看个荔枝【 将中缀表达式:a + b * c + (d * e + f) * g 转换为 后缀表达式: a b c * + d e * f + g * + 】
我们来看转换步骤:

  • step1)读入a,a被输出;读入+, 由于操作符栈空,故+进栈;读入b,b被输出;栈和输出的状态如下:
    这里写图片描述

  • step2)读入*,由于栈顶+的优先级小于*,故*进栈;读入c,c被输出;栈和输出的状态如下:
    这里写图片描述

  • step3)读入+,由于栈顶*的优先级大于+,*出栈被送往输出;有由于栈顶+的优先级等于+,+出栈被送往输出;栈和输出的状态如下:
    这里写图片描述
  • step4)读入(,由于(的优先级最高,故(进栈;读入d,d被输出;栈和输出的状态如下:
    这里写图片描述
  • step5)读入*,由于(和)不会被输出,故*进栈;读入e,e被输出;栈和输出的状态如下:
    这里写图片描述
  • step6)读入+, 由于栈顶*的优先级大于+,故*出栈被送往输出;然后+进栈;读入f,f被输出;栈和输出的状态如下:
    这里写图片描述
  • step7)读入),将栈中运算符出栈并被输出,直到取出(为止,而(和)不会被输出;栈和输出的状态如下:
    这里写图片描述
  • step8)读入*, 由于栈顶+的优先级小于*,故*进栈;读入g,g被输出;栈和输出的状态如下:
    这里写图片描述
  • step9)读完表达式后,栈中还有操作符,将它们出栈,并放入到输出字符串;栈和输出的状态如下:
    这里写图片描述

  • 中缀转后缀的源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter3/p54_infix_to_postfix
    这里写图片描述


【2】计算后缀表达式

2.1)后缀表达式定义: 4.99*1.06 + 5.99 + 6.99*1.06 转换为后缀表达式为: 4.99 1.06 * 5.99 + 6.99 1.06 * +;这种记法叫做 后缀 或者 逆波兰 记法;

2.2) 计算一个后缀表达式花费的时间是O(N);

2.3)计算后缀表达式规则(Rules):

  • R1) 如果是操作数,则放入栈中;
  • R2) 如果是操作符(运算符),则取出栈中两个操作数,进行运算后,将结果放入栈中;
  • R3) 直到最后栈中只有一个元素,此元素就是计算结果;

2.4)看个荔枝(计算后缀表达式 1 2 3 * + 4 5 * 6 +7 * + )

  • 我们看处理步骤:
  • step1)1、2、3进栈,结果如下:
    这里写图片描述
  • step2)下面读到一个*, 所以2、3弹出, 将它们的积6压栈,结果如下:
    这里写图片描述
  • step3)下面读到一个+,所以1、6弹出,将它们的和7压栈,结果如下:
    这里写图片描述
  • step4)下面读到 4、5 , 将它们压栈,结果如下:
    这里写图片描述
  • step5)下面读到一个*,所以4、5弹出,将它们的积20压栈,结果如下:
    这里写图片描述
  • step6)下面读到6,所以6压栈,结果如下:
    这里写图片描述
  • step7)下面读到一个+,所以20、6弹出,将它们的和26压栈,结果如下:
    这里写图片描述
  • step8)下面读到7,所以7压栈,结果如下:
    这里写图片描述
  • step9)下面读到一个*,所以26、7弹出,将它们的积182压栈,结果如下:
    这里写图片描述
  • step10)下面读到一个+,所以7、182弹出,将它们的和189压栈,结果如下:
    这里写图片描述
  • step11)最后栈中就只有一个元素189了,所以结果就是189,并将其返回到主函数;

  • 计算后缀表达式(只考虑‘+’和 ‘*’) 的源代码:
    https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter3/p52_compute_postfix

    • Attention)当一个表达式以 后缀记号 给出时,没有必要知道任何优先级规则, 这是一个明显的优点;
      这里写图片描述

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

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

相关文章

用户/账户/账号的理解

文章目录用户账户账号关系用户 用户概念的理解: 用户就是使用者,可以是个人用户,也可以是机构用户。 账户 账户概念的理解: 账户,所谓“账”,就是系统根据“账”来存储和管理数据,类似记账…

azure 部署java_jClarity:在Azure上升级到Java

azure 部署java在互联世界公共基础设施的新时代,最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此,许多公司将时间和资源投入到构建最先进的技术上,以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量,而且免费…

黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾

2010年刚上大学那会,入手了人生第一台笔记本电脑,两边密密麻麻的各种接口,也没感觉到接口多少的价值;2016年年中入手了人生第一台苹果笔记本,第一次觉得电脑接口不够用;如今四年过去了电脑也到了更新换代的…

利用树的先序和后序遍历打印os中的目录树

【0】README0.1)本代码均为原创,旨在将树的遍历应用一下下以加深印象而已;(回答了学习树的遍历到底有什么用的问题?)你对比下linux 中的文件树 和我的打印结果就明理了;0.2)我们采用…

Hibernate常用API

文章目录删除指定的记录新增记录更新记录清空缓存将实体对象从缓存中清除将缓存中更新的数据同步到数据库把数据库中的数据刷到缓存中查询多个对象(也就是查询多条记录)查询指定ID的对象(查询指定ID值的记录)参考删除指定的记录 U…

solid设计原则_SOLID设计原则

solid设计原则介绍: Robert C. Martin定义了五项面向对象的设计原则: 小号英格尔-责任原则 笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则,并 d ependency倒置原则 这些一起被普遍称为SOLID原则。 在设计面向对象的系统时&a…

nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性

关系型数据库的局限NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战:1、高并发一个最典型的就是电商网站,例如双11,几亿大军的…

二叉树的先中后序遍历

【0】README 0.1)本文旨在理清二叉树的先中后序遍历, 以及如何建立二叉树等相关内容; 0.2)本文涉及代码均为原创; 0.3)本文中遍历后的打印结果,朋友您可以直接写出二叉树的节点构造出来&…

表达式树

【0】README 0.1)本文旨在总结出表达式树的构建步骤, 其中还涉及到中缀转后缀表达式,以及如何计算 表达式树中的值; 0.2)本文源代码均为原创; 0.3) 其实, 实现一个简单的计算器&a…

Date/Timestamp/String/LocalDate/LocalDateTime

文章目录String 转成 DateDate 转成 StringString 转成 Timestamp获取系统当前的毫秒数获取系统当前的日期时间毫秒数转成 Timestamp毫秒数转成 DateTimestamp 转成 StringDate 转成 TimestampTimestamp 转成 Datejava.util.Date 转成 java.sql.Date将带T的日期时间转成正常的日…

python可以用来写什么工具_python写工具

谷歌开源 Python Fire:可自动生成命令行接口今天我们很高兴地宣布 Python Fire 开源。Python Fire 可从任何 Python 代码生成命令行接口(command line interfaces (CLIs)),简单地调用任意 Python 程序中的 Fire 函数以将那个程序自动地转化为 CLI。该库可…

java原始类型和引用类型_Java中的8种原始类型

java原始类型和引用类型几年前,当我开始编辑Java Basics系列时,我认为将一些非常详细的信息拉到自己的帖子中是很有意义的。 这样,初学者的内容就更容易消化了。 首先,我将介绍有关Java的8种原始类型的所有信息。 Java基本类型 正…

androidtabhost缓存_FragmentTabHost布局的使用及优化方式

欢迎Follow我的GitHub, 关注我的简书. 其余参考Android目录.TabHostAndroidFragmentTabHost作为Android4.0版本的控件, 已经被项目广泛使用, 5.0版本又推出TabLayoutViewPager显示多页. 我来讲解如何使用FragmentTabHost.本文源码的GitHub下载地址主要包括:(1) 自定义Tab的图片…

二叉查找树

【0】README 0.1)本文的重点在于介绍 二叉查找树的概念,以及写出 二叉查找树的操作例程的源代码, 其中当属delete 操作的源代码最不容易实现; 0.2)本文源代码均为原创, 当然 代码中的idea 是借鉴人家的&a…

常用的命名规范/命名规则

文章目录骆驼式命名法(CamelCase)帕斯卡命名法(PascalCase)串式命名法(KebabCase)下划线命名法(UnderScoreCase)骆驼式命名法(CamelCase) 也叫小驼峰式命名法…

spring order_Spring @Order批注

spring order介绍: Spring Order注释是在Spring 2.0中首次引入的。 然后,它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面,对该注释的实现进行了进一步改进。 从那时起,它还支持对Java数组或List之类的集合中的Spring组件或…

AVL树

【0】README 0.1)本文给出了平衡二叉树(AVL树)的插入例程涉及到的单旋转双旋转的概念,并给出了代码实现; 0.2)本文源代码均为原创, 当然相关idea 还是借鉴人家的;(真心…

spring 注释_Spring@懒惰注释

spring 注释介绍: 默认情况下, Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中,我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&…

管理系统的账户设计(涉及注册/登录逻辑)

文章目录方案一方案二方案三方案一 类似华为云IAM(Identity and Access Management 身份和访问管理)用户,阿里云的 RAM(Resource Access Management 资源访问管理)用户 机构有独立的账户(主账户&#xff…

opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例

1.VideoCapture可以打开多种来源的数据流,但常见的是相机、视频及图像序列三类数据流:(1)打开相机数据流,需要指定相机在主机上的设备编号,若主机上只有一个相机则编号通常是0。(2)打开视频数据流,需要指定视频的完整路…