中序表达式转后序表式式

中序表达式转后序表式式:

将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式

举例:
原式:a+b*(c+d/e)
补全括号:(a+(b*(c+(d/e))))
操作符右移:(a(b(c(de)/)+)*)+
去掉括号:abcde/+*+


中序表达式转前序表式式:

将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式

举例:
原式:a+b*(c+d/e)
补全括号:(a+(b*(c+(d/e))))
操作符右移:+(a*(b+(c/(de))))
去掉括号:+a*b+c/de

算法:

利用运算符栈(OPTR)和数据栈(OPND)将中缀表达式转化为后缀表达式。

将结束标志字符’#’放入操作符栈(OPTR); 
从中缀表达式pre左端依次读取pre[i]:

  • 1.若pre[i]为操作数,压入数据栈(OPND);
  • 2.若pre[i]为左括号,压入操作符栈(OPTR);
  • 3.若pre[i]为右括号,则将操作符栈(OPTR)中的运算符依次出栈并压入数据栈(OPND),直到遇到左括号为止,但是该左括号出栈但不压入数据栈(OPND)
  • 4.若pre[i]为操作符
    (1)若操作符栈(OPTR)为空,将此操作符pre[i]压入数据栈(OPND); 
    (2)若pre[i]的优先级大于操作符栈(OPTR)顶的优先级,将此操作符pre[i]压入数据栈(OPND); 
    (3)若操作符栈(OPTR)不为空且pre[i]的优先级小于等于操作符栈(OPTR)顶的优先级,将操作符栈(OPTR)中的运算符依次出栈并压入数据栈(OPND),直到不满足条件,此操作符pre[i]压入数据栈(OPND)

直到遍历完整个中序表达式之后,操作符栈(OPTR)中仍然存在运算符,那么将这些运算符依次出栈加入到数据栈(OPND)中,直到栈为空。

按照上述步骤完成后,将操作符栈(OPTR)逆序即可得到逆波兰表达式。

时间: 2024-10-13 02:10:29

中序表达式转后序表式式的相关文章

中序表达式 to 后序表达式

将带有计算的优先级和括号的中序表达式变成符合某文法的后序表达式. <编程导论(Java)·5.5.2>的参考资料 解释器模式中或许需要的工具 直接上代码. package intent.interpreter.calculator2; import java.util.HashMap; import java.util.Stack; import tool.God; public class Nothing{ private static HashMap<Character,Intege

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历

表达树就是根据后缀表达式来建立一个二叉树. 这个二叉树的每个叶子节点就是数,真祖先都是操作符. 通过栈来建立的,所以这里也会有很多栈的操作. 树的先序遍历,中序遍历,后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码. 下面是代码: // // main.cpp // expressionTree // // Created by Alps on 14-7-29. // Copyright (c) 2014年 chen. All rights reserved. // #includ

二叉树的广义表创建及中序遍历、后序遍历、层次遍历的非递归算法(C语言)

广义表创建二叉树关于用广义表的形式表示二叉树的形式如下 ①广义表中的一个字母代表一个结点的数据信息.②每个根结点作为由子树构成的表的名字放在义表的前面.③每个结点的左子树与右子树之间用逗号分开.若结点只有右子树面无左子树,则该逗号不能省略.④在整个广义表的末尾加一个特殊符号(如“@”)作为结束标志. 下面先用自然语言描述算法如下.依次从广义表中取得-个元素,并对取得的元素做如下相应的处理. ①若当前取得的元素为字母,则按如下规则建立一个新的(链)结点.a)若该结点为二叉树的根结点,则将该结点的地

根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找一下链接出来...... 1127. ZigZagging on a Tree (30):https://www.patest.cn/contests/pat-a-practise/1127 突然想起以前学数据结构的时候如果给出一个中序遍历和一个后序遍历然后让你画出树的结构或求出先序遍历之类的题目,

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

根据前序遍历和中序遍历求后序遍历

根据前序遍历和中序遍历求后序遍历 一道HULU的笔试题(How I wish yesterday once more) 假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder:         GDAFEMHZ InOrder:            ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"AD

根据前序和中序遍历求后序 /后序和中序求前序

给出一二叉树的前序遍历的顺序和中序遍历的顺序我们可以由此得出后序遍历的顺序,根据它们的访问顺序,前序遍历的第一个结点肯定是根结点,与之对应在中序遍历找到对应的根结点的位置,那么在中序遍历中,根结点的左边的元素都属于左子树的元素,根结点右边的元素都属于右子树的元素,之后把左子树当成一个继续操作,就这样可以推出整个树,继而求出后序遍历: #include<iostream> #include<cstdlib> #include<cstring> #include<cs

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

二叉树重建 - (先序遍历、中序遍历、后序遍历)

对于一棵二叉树T,我们可以递归定义它的先序遍历,中序遍历,后序遍历:  1.先序遍历  ( PreOrder(T) = T的根节点 + PreOrder(T的左子树) + PreOrder(T的右子树) ) 2.中序遍历  ( InOrder(T) = InOrder(T的左子树) + T的根节点 +  InOrder(T的右子树) ) 3.后序遍历  ( PostOrder(T) = PostOrder(T的左子树) + PostOrder(T的右子树)  + T的根节点 ) 其中,加号表