首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法

对于从来没有接触过后缀表达式的同学来讲,这样的表述是很难受的。不过你不喜欢,有机器喜欢,比如我们聪明的计算机。 二、中缀表达式转后缀表达式 1....传统方法 我们把平时所用的标准四则运算表达式,即“9+(3-1)×3+10÷2”叫做中缀表达式。因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化。...此栈用来对要运算的数字进出使用。如图 3-1 的左图所示。 后缀表达式中前三个都是数字,所以 9、3、1 进栈,如图 3-1 的右图所示。...从刚才的推导中你会发现,要想让计算机具有处理我们通常的标准(中缀)表达式的能力,最重要的就是两步: 将中缀表达式转化为后缀表达式(栈用来进出运算的符号)。...将后缀表达式进行运算得出结果(栈用来进出运算的数字)。整个过程,都充分利用了栈的后进先出特性来处理,理解好它其实也就理解好了栈这个数据结构。

21610

中缀表达式转换为后缀表达式(栈的使用)

中缀表达式如1*2+(2-1), 其运算符一般出现在操作数之间, 因此称为中缀表达式,也就是大家编程中写的表达 式。...为达到上述目的, 就要将中缀表达式进行改写,变为后缀表达式 如上面的表达式 1*2+(2-1), 就变为12*21-+; 后缀表达式中不含有括号, 且后缀表达式的操作数和中缀表达式的操作数排列次序完全相同...我们实现的时候,只需要用一个特定工作方式的数据结构(栈),就可以实现。 其中stack op;用来存放运算符栈。数组ans用来存放后缀表达式。...算法思想: 从左到右扫描中缀表达式,是操作数就放进数组ans的末尾。 如果是运算符的话,分为下面3种情况: 1)如果是‘(’直接压入op栈。...如果扫描结束,栈中还有元素,则依次弹出加到数组ans的末尾,就得到了后缀表达式。

40610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    中缀转后缀 本文大部分资料参考慕课何钦铭老师的数据结构 相关的慕课链接:表达式求值 中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级....先举个简单的转换例子 2+9/3-5 (前缀)-> 2 9 3 / + 5 – (后缀) 先进行乘除再进行加减 运算规律,运算数位置不变,改变的是运算符位置 可以推栈实现,用堆栈储存等待中的运算符...将当前运算符与最后一个等待的运算符比较....再来解释一下开始的简单例子 带括号的运算 选取慕课里何钦铭老师的案例 后缀表达式运算步骤: (以堆栈储存) 从左到右,遇到运算符就弹出相应的运算数,运算后再把结果入栈.最终结果就是栈顶数的值...这篇文章只是整理中缀表达式转后缀表达式的方法和理论,目的是为了理解. 具体代码实现看我的另一篇文章(模拟表达式运算). 这部分转换对于初学者来说可能很模糊,建议去看开头链接的那个视频.

    43320

    栈(Stack) 原

    链式栈的基本运算同顺序栈。它是对链表实现的简单化。 使用单向链表实现的栈只能对表头进行操作,因为不能反向查找。 3>顺序栈和链式栈对比 实现顺序栈和链式栈都需要常数时间。...现实生活中使用的是中缀表达式,计算机内存储表达式时一般采用后缀或前缀表达式。 一个表达式通常由操作数、运算符及分隔符所构成。...中缀表达式就是将运算符放在操作数中间,例如:a+b*c 由于运算符有优先级,所以在计算机内部使用中缀表达式是非常不方便的。...以中缀表达式a/(b-c)为例,演示一下中缀表达式转换为前缀表达式的具体步骤: 第一步:先处理优先级高的,括号内将(b-c)转换为(-bc)。...中缀表达式的计算需要使用两个堆栈,并且计算比较频繁,而后缀或前缀表达式的实现只需要一个堆栈。 将中缀表达式转换为后缀表达式,转换原则如下: 第一:从左至右读取一个中缀表达式。

    72920

    堆栈的应用——用JavaScript描述数据结构

    一个堆栈的数据结构就搞定了。...将传入的数组进行倒序遍历,并逐个压入堆栈 最后使用read接口,输出数据 好像很简单,不用担心,复杂的在后面:) 2.2 十进制转换为二进制 数值转换进制的问题,是堆栈的小试牛刀。...常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +” 调度场算法(Shunting Yard Algorithm)是一个用于将中缀表达式转换为后缀表达式的经典算法,由艾兹格·迪杰斯特拉引入...由于乘除运算符前后的数字,在运算上有区别,所以不能随意调换位置。 2.4 中缀表达式转换为后缀表达式(逆波兰表示法) 逆波兰表示法,是一种对计算机友好的表示法,不需要使用括号。...下面案例,是对上一个案例的变通,也是用调度场算法,将中缀表达式转换为后缀表达式。

    1K30

    前端学数据结构 - 栈(Stack)和 队列(Queue)

    入栈和出栈 因为这两个库底层都是基于链表完成(重操作、轻查询),所以复杂度和链表是一样的。 因为这两个库底层都是基于链表完成(重操作、轻查询),所以复杂度和链表是一样的。...队列比较常用的是广度优先遍历,在树中是层序遍历,在图中是无权图的最短路径; 栈能帮助你实现深度优先遍历等; 2、栈的应用 在 JS 中,队列和数组很相似,所以平时使用队列的场景会比较多;而对于栈这种数据结构接触的比较少...= 4; for(let i = n; i > 0; i--) { a.push(i); } // test towerOfHanoi(a.length, a, b, c); 4、调度场算法(中缀表达式转后缀表达式...) 计算器的核心算法-JavaScript实现(逆波兰表达式):很详细的教程,利用两个栈实现计算器,还有 demo; javascript使用栈结构将中缀表达式转换为后缀表达式并计算值:例子详实,推荐...--------------------------------- 调度场算法,将中缀转换过程后缀表达式 --------------------------------------------

    1K10

    【Java数据结构和算法】009-栈:前缀、中缀、后缀表达式(逆波兰表达式)

    ,那后缀表达式就是将符号放后面(实际上不完全相似,具体见后缀表达式)) 2、前缀表达式的计算求值逻辑 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算...(后缀表达式),使用栈(Stack), 计算其结果; ②支持小括号和一位整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数的计算; 代码实现: (使用后缀表达式计算) package...最终计算结果:15 四、中缀表达式转后缀表达式【重点】 1、步骤 ①初始化两个栈:运算符栈s1和储存中间结果的栈s2; ②从左至右扫描中缀表达式; ③遇到操作数时,将其压s2; ④遇到运算符时,比较其与...; ⑥重复步骤2至5,直到表达式的最右边; ⑦将s1中剩余的运算符依次弹出并压入s2; ⑧依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式; 2、举个例子 举例说明: 将中缀表达 式...“1+((2+3)×4)-5”转 换为后缀表达式的过程如下: (结果为 "1 2 3 + 4 × + 5 –") 扫描到的元素 s2(栈底->栈顶) s1 (栈底->栈顶) 说明 1 1 空 数字,直接入栈

    12910

    动图+源码+总结:演示 JDK8 中的数据结构(珍藏版)

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算....中缀转后缀 1、数字直接输出 2、栈为空时,遇到运算符,直接入栈 3、遇到左括号, 将其入栈 4、遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 1、遇到数字时,将数字压入堆栈 2、遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 3、重复上述过程直到表达式最右端 4、运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲. put(K, V*)* ?

    39320

    图解 Java 中的数据结构及原理,傻瓜也能看懂!

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算。...中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲。

    46220

    几张动态图捋清Java常用数据结构及其设计原理

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算....中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲. put(K, V) ?

    45930

    图解Java常用数据结构(一)

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算....中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲. put(K, V) ?

    1.4K30

    图解Java常用数据结构(一)

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算....中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲. put(K, V) ?

    48250

    【动态图】教你捋清Java常用数据结构及其设计原理

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下。 ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算....中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲. put(K, V) ?

    46420

    【动态图】教你捋清Java常用数据结构及其设计原理

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下。 ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算....中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲. put(K, V) ?

    37430

    Java | 图解数据结构及原理,傻瓜也能看懂!

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算。...推荐阅读: 中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲。 ? put(K, V) ?

    67640

    动图+源码+总结:演示JDK8 中的数据结构执行过程及原理

    HashMap中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异 本文目录结构如下: ? LinkedList 经典的双链表结构, 适用于乱序插入, 删除....后缀表达式 Stack的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式, 再对后缀表达式进行计算。...中缀转后缀 1、数字直接输出 2、栈为空时,遇到运算符,直接入栈 4、遇到左括号, 将其入栈 4、遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...计算后缀表达 1、遇到数字时,将数字压入堆栈 2、遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 3、重复上述过程直到表达式最右端 4、运算得出的值即为表达式的结果 ?...HashMap 最常用的哈希表, 面试的童鞋必备知识了, 内部通过数组 + 单链表的方式实现. jdk8中引入了红黑树对长度 > 8的链表进行优化, 我们另外篇幅再讲。 put(K, V) ?

    84040

    邂逅栈

    处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。 表达式的转换[中缀表达式转后缀表达式] 与求值 (实际解决)。 二叉树的遍历。...中缀转后缀表达式的计算机求值 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端...-6的值,即29,由此得出最终结果 我们完成一个逆波兰计算器,要求完成如下任务: 输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果 支持小括号和多位数整数,因为这里我们主要讲的是数据结构...思路分析 代码完成 中缀转后缀 大家看到,后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长的情况下,因此在开发中,我们需要利用后缀表达式计算器将中缀表达式转成后缀表达式。...,其基本思路和前面一样,也是使用到:中缀表达式转后缀表达式。

    45510

    算法 - 调度场算法(Shunting Yard Algorithm)

    温馨提示:因微信中外链都无法点击,请通过文末的” “阅读原文” 到技术博客中完整查阅版;(本文整理自技术博客) 在总结 栈(Stack) 这个数据结构时候,栈有一种应用是计算算术表达式的 —— 中缀转后缀的...4、练习 自己手动使用调度栈将 a + b * c + ( d * e + f ) * g 转换成后缀表达式。...如果你不好理解调度场算法的话,可以先列出算式对应的 AST,然后再做一把后续遍历就能获得逆波兰式; REFERENCE 参考文档 1、中缀转后缀 计算器的核心算法-JavaScript实现(逆波兰表达式...):很详细的教程,利用两个栈实现计算器,还有 demo; javascript使用栈结构将中缀表达式转换为后缀表达式并计算值:例子详实,推荐 How to implement a basic mathematical...:很详细的图文讲解,每一步都有图示,对初学者很友好; Codewars:从逆波兰表达式到Three-Pass编译器(1):看作者是如何举一反三,利用 RPN 完成解题; 如何在程序中将中缀表达式转换为后缀表达式

    2.8K10

    图解Java常用数据结构

    HashMap 中的单链表是尾插, 而不是头插入等等, 后文不再赘叙这些差异, 本文目录结构如下: [j14gy7maqe.png] LinkedList 经典的双链表结构, 适用于乱序插入, 删除....linkedlist, 而是使用 iterator 的方式遍历....[st2bgigm0o.gif] pop() [jdhkpmz27l.gif] 后缀表达式 Stack 的一个典型应用就是计算表达式如 9 + (3 - 1) * 3 + 10 / 2, 计算机将中缀表达式转为后缀表达式...中缀转后缀 数字直接输出 栈为空时,遇到运算符,直接入栈 遇到左括号, 将其入栈 遇到右括号, 执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。...[qqf79tu7fk.gif] 计算后缀表达 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算, 并将结果入栈 重复上述过程直到表达式最右端 运算得出的值即为表达式的结果

    45650

    【数据结构】C语言实现表达式的转换

    当然还有一种操作受限的线性表也是可以满足咱们的需求的。没错就是队列。因此对表达式进行转换时,我们可以通过使用栈和顺序表、栈和链表或者栈和队列来共同完成。...接下来我们就来通过代码实现表达式之间的相互转换; 3.3 算法实现 通过前面的算法设计,我们已经明确了我们的实现思路,如下所示: 对中缀表达式的扫描方向的选择: 中缀转后缀:从左往右扫描; 中缀转前缀...:从右往左扫描 对数据结构的选择: 通过栈来存放操作符; 通过顺序表/链表/队列来存放操作数; PS:在今天的实现中,我通过栈和数组来共同实现; 改写时的算法功能: 将扫描到的操作数存放入数组内;...对于中缀转前缀的代码的实现,有兴趣的朋友可以按照中缀转后缀的思路进行代码的编写,只不过这里我需要提醒一下大家,扫描的方向别弄错咯! 结语 现在我们就介绍完了通过代码实现表达式转换的全部内容。...在今天的内容中我们详细探讨了实现表达式转换的具体过程,并最终确定了表达式转换实现的具体思路: 对中缀表达式的扫描方向的选择: 中缀转后缀:从左往右扫描; 中缀转前缀:从右往左扫描 对数据结构的选择:

    10310
    领券