中缀转前缀(表达式)

问题描述:

  中缀到前缀示例:

    ( 4 + 2 ) * ( 3 + 6 ) =>  * + 4 2 + 3 6

    (3 /4 + 2) - 5 => - + / 3 4 2 5

    (3 + 4/2) - 5 => - + 3 / 4 2 5

  如果将表达式画成树形结构,则前缀、中缀、后缀分别是树的先序、中序、后序遍历。

  -----------------*------------------

  ------------/-----------\-----------

  --------+----------------+---------

  ------/----\------------/-----\------

  ----4-------2---------3-------6----

思路1(栈):

  1. 从右向左读

  2. 遇到数字添加到输出流头部,遇到符号则按优先级判断入栈:

    1)低入高出

    2)右括号,出栈直到遇到左括号

思路2(补全括号):

  1. 中缀:a+b*c-(d+e)

  2. 按优先级补括号:((a + (b*c)) - (d+e))

  3. 移动操作符到括号前:-(+(a*(bc))+(de))

  4. 去括号:- + a * b c + d e

  PS:

    后缀与此类似,只是将操作符移植相应括号后方。

思路3(树):

  1. 中缀转成树结构(按操作符优先级)

  2. 先序遍历树结构

转载请注明引用自:

  http://www.cnblogs.com/breakthings/p/4051909.html

时间: 2024-10-19 17:39:41

中缀转前缀(表达式)的相关文章

前缀、中缀、后缀表达式

先举例: (3 + 4) × 5 - 6 中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式 以前没见过前缀和后缀表达式,感觉一下刷新了知识库!原来在计算机里早已司空见惯了…… 完了,一下暴露非科班出身了……不扯了,下面这篇文章对这三种表达式介绍的很不错,特拿来分享下! 地址:http://blog.csdn.net/antineutrino/article/details/6763722

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计

中缀表达式转换成前缀表达式和后缀表达式

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我

[转]中缀表达式、前缀表达式、后缀表达式的相互转换

--------------------------------后缀转中缀---------------------------------------------- 1.建立一个栈,从左向右扫描后缀表达式,遇到运算数则压入栈: 2.遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果作为新的运算符再压入栈: 3.依次走到表达式结尾: 例:把逆波兰式(即后缀表达式)ab+c*转换为中缀表达式: 1)a入栈(0位置) 2)b入栈(1位置) 3)遇到运算符"+",将a和b出栈,执行a+b的

深入理解前缀、中缀、后缀表达式

1.我们首先来看一下,什么是前缀.中缀.后缀表达式: 中缀表达式: 2 - 3 * 4 后缀表达式:2 3 4 * - 前缀表达式:- 2 * 3 4 简单介绍下,前中后的划分依据为两个数字的操作符处于两个数字的前面,中间还是后面,其中中缀表达式为我们日常生活中常见的表达形式. 2.重要操作过程 后缀表达式求值过程: 从左到右扫描后缀表达式:遇到数字就将其压入栈中:遇到操作符,则取出栈顶的两个元素(栈顶元素为a, 另一个为b),并计算b 操作符 a的取值,并将结果重新压入栈中.扫描整个表达式结束

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

表达树—轻松获取前缀、中缀、后缀表达式(二)

一.回顾二叉树的递归遍历 前序遍历:访问根结点-->前序遍历根结点的左子树-->前序遍历根结点的右子树. 中序遍历:中序遍历根结点的左子树-->访问根结点-->中序遍历根结点的右子树. 后序遍历:后序遍历根结点的左子树-->后序遍历根结点的右子树-->访问根结点. 二.二叉树递归遍历获得表达式 假设,已知中缀表达式为:(A+B*C)/D,需要获得前缀表达式,后缀表达式. 总结:表达树的前序遍历为前缀表达式,中序遍历为中缀表达式,后续遍历为后缀表达式. 前缀表达式(前序遍

中缀表达式转后缀表达式和前缀表达式

中缀表达式化后缀表达式: (1+3)/8*3-5= 构建一个空运算符栈.先向里面压入一个'='(方便后边的比较).然后从左向右扫描中缀表达式,如果是操作数,则直接输出即可:如果是左括号则直接入栈,如果是右括号,则弹栈,直到左括号且将左括号也弹出:如果是其他运算符,则按照乘除优先于加减,如果是乘除(加减)则按照谁先进栈谁优先,即a优先于b表示为a>b,如果栈顶元素优先于当前元素,则一直弹栈,直到栈顶优先级小于当前元素优先级,将当前元素压栈,如果优先级相同,只需弹栈就可以了. /*比较栈顶元素跟当前

算术表达式的前缀表达式,中缀表达式和后缀表达式

这里所谓的前缀,中缀,后缀是根据操作符的位置来定的,如果操作符在操作数前面,则称为前缀表达式,例如"- + 1 × + 2 3 4 5";如果操作符在操作数之间,则称为中缀表达式,例如 "1+((2+3)×4)-5";如果操作符在操作数后面,则称为后缀表达式,例如"1 2 3 + 4 × + 5 -". 虽然中缀表达式符合人类的日常思维习惯,但是计算机在存储中缀表达式时,需要使用树这种数据结构,如果表达式过于复杂,那么树的高度会变得很高,大大增加