中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式

中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式中缀转后缀本文大部分资料参考慕课何钦铭老师的数据结构相关的慕课链接:表达式求值中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级.后缀表达式是计算机容易运算的表达式,运算符在运算数后面,从左到右进行运算,无需考虑优先级,运算呈线性结构.先举个简单的转换例子2+9/3-5(前缀)->293/+5-(后缀)先进行乘除再进行加减运算规律,…

大家好,又见面了,我是你们的朋友全栈君。

中缀转后缀
本文大部分资料参考慕课何钦铭老师的数据结构
相关的慕课链接:表达式求值
中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级.
后缀表达式是计算机容易运算的表达式,运算符在运算数后面,从左到右进行运算,无需考虑优先级,运算呈线性结构.
先举个简单的转换例子
2+9/3-5 (前缀)-> 2 9 3 / + 5 – (后缀)
先进行乘除再进行加减
运算规律,运算数位置不变,改变的是运算符位置
可以推栈实现,用堆栈储存等待中的运算符.
将当前运算符与最后一个等待的运算符比较.

具体转换方式:
1.从左到右进行遍历
2.运算数,直接输出.
3.左括号,直接压入堆栈,(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈)
4.右括号,(意味着括号已结束)不断弹出栈顶运算符并输出直到遇到左括号(弹出但不输出)
5.运算符,将该运算符与栈顶运算符进行比较,
如果优先级高于栈顶运算符则压入堆栈(该部分运算还不能进行),
如果优先级低于等于栈顶运算符则将栈顶运算符弹出并输出,然后比较新的栈顶运算符.
(低于弹出意味着前面部分可以运算,先输出的一定是高优先级运算符,等于弹出是因为同等优先级,从左到右运算)
直到优先级大于栈顶运算符或者栈空,再将该运算符入栈.
6.如果对象处理完毕,则按顺序弹出并输出栈中所有运算符.

再来解释一下开始的简单例子
在这里插入图片描述
括号的运算
在这里插入图片描述
选取慕课里何钦铭老师的案例
在这里插入图片描述
后缀表达式运算步骤:
(以堆栈储存)
从左到右,遇到运算符就弹出相应的运算数,运算后再把结果入栈.最终结果就是栈顶数的值.
(由于该运算为线性结构,具体运算时是不需要储存输出后的运算符,一般是输出一个运算符就进行一次运算,不像图中要储存输出状态.)
注意点:
有时候’-’(负号)是单目运算符,则要修改运算数.
遇到其他运算符(如幂运算)也类似.

这篇文章只是整理中缀表达式转后缀表达式的方法和理论,目的是为了理解.
具体代码实现看我的另一篇文章(模拟表达式运算).
这部分转换对于初学者来说可能很模糊,建议去看开头链接的那个视频.
如果有什么错误或不足欢迎评论指出.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149079.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 单例模式singleton_单例模式例子

    单例模式singleton_单例模式例子单例模式 Singleton动机模式定义实例结构要点总结笔记动机在软件系统中,经常有一些特殊的类,必须保证它们在系统中只存在一个实例,才能保证他们的逻辑正确性、以及良好的效率如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?模式定义保证一个类仅有一个实例,并提供一个该实例的全局访问点。实例单例class Singleton{private : Singleton(); Singleton(const Singleton& other);public:

    2022年8月9日
    9
  • ssm整合RabbitMQ(一)「建议收藏」

    ssm整合RabbitMQ(一)「建议收藏」首先说一下RabbitMQ的配置安装好RabbitMQServer之后访问http://localhost:15672/开始首先在Admintab选项中新建一个vh,这个Name需要在后期的代码配置中用到。之后需要给该VH配置一个权限然后配置交换选择Exchangestab将Exchanges与刚才建立的VH绑定然后命名一个交换名字,这个名字在后期的…

    2022年5月23日
    36
  • WinHttp应用demo

    WinHttp应用demo#include#include#include#pragmacomment(lib,”winhttp”)structcallback_param_t{HINTERNEThInet;DWORDdwErrCert;};staticVOIDCALLBACKSyncCallback(HINTERNET,DWORD_PTR,DWORD,

    2022年7月11日
    15
  • char *string=”xxxxxxxxx” 与 char string[]=”xxxxx”的区别

    char *string=”xxxxxxxxx” 与 char string[]=”xxxxx”的区别char*string=”xxxxxx“这种方式使用的字面值模式,只读,不可以修改。string是个指针,这个字符串存放在程序的RODATA(read-only)段,不能修改的!表示你定义了一个字符指针,这个指针指向一个字符串常量,既然是常量那么通过这个指针修改这个常量是不可以的。charstring[]=”xxxxx”这种方式,字符串存储在数组

    2022年8月22日
    7
  • kettle工具使用及集成[通俗易懂]

    kettle工具使用及集成[通俗易懂]kettle简介Kettle是一款免费开源的基于Java的企业级ETL工具,功能强大简单易用,无可抗拒。

    2022年10月9日
    3
  • metrics小常识

    metrics小常识Metrics,我们听到的太多了,熟悉大数据系统的不可能没听说过metrics,当我们需要为某个系统某个服务做监控、做统计,就需要用到Metrics。举个例子,一个图片压缩服务:每秒钟的请求数是多少(TPS)?平均每个请求处理的时间?请求处理的最长耗时?等待处理的请求队列长度?又或者一个缓存服务:缓存的命中率?平均查询缓存的时间?基本上每一个服务、应用都需要

    2025年7月10日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号