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

将中缀表达式(带括号)转换为二叉树

这个问题可以转化为一个典型的树形结构问题。我们可以使用一个二叉树来表示中缀表达式,其中每个节点表示一个操作,其左子树表示操作数,右子树表示操作符。

在将中缀表达式转换为二叉树时,我们需要遵循以下步骤:

  1. 首先,将中缀表达式的操作数转换为二叉树的左子树。
  2. 然后,将中缀表达式的操作符转换为二叉树的右子树。
  3. 最后,将左子树和右子树连接起来,形成二叉树。

以下是一个示例代码,实现了将中缀表达式转换为二叉树的功能:

代码语言:python
代码运行次数:0
复制

class TreeNode:

代码语言:txt
复制
def __init__(self, val=0, left=None, right=None):
代码语言:txt
复制
    self.val = val
代码语言:txt
复制
    self.left = left
代码语言:txt
复制
    self.right = right

def inorder_to_postorder(inorder):

代码语言:txt
复制
if not inorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(inorder[0])
代码语言:txt
复制
i = 1
代码语言:txt
复制
while i < len(inorder) and inorder[i] == inorder[0]:
代码语言:txt
复制
    i += 1
代码语言:txt
复制
root.left = inorder_to_postorder(inorder[1:i])
代码语言:txt
复制
root.right = inorder_to_postorder(inorder[i:])
代码语言:txt
复制
return root

def inorder_to_preorder(inorder):

代码语言:txt
复制
if not inorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(inorder[0])
代码语言:txt
复制
i = 1
代码语言:txt
复制
while i < len(inorder) and inorder[i] == inorder[0]:
代码语言:txt
复制
    i += 1
代码语言:txt
复制
root.left = inorder_to_preorder(inorder[1:i])
代码语言:txt
复制
root.right = inorder_to_preorder(inorder[i:])
代码语言:txt
复制
return root

def inorder_to_prefix_tree(inorder):

代码语言:txt
复制
if not inorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(inorder[0])
代码语言:txt
复制
i = 1
代码语言:txt
复制
while i < len(inorder) and inorder[i] == inorder[0]:
代码语言:txt
复制
    i += 1
代码语言:txt
复制
root.left = inorder_to_prefix_tree(inorder[1:i])
代码语言:txt
复制
root.right = inorder_to_prefix_tree(inorder[i:])
代码语言:txt
复制
return root

def prefix_to_inorder(prefix, inorder):

代码语言:txt
复制
if not prefix or not inorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
i = len(inorder)
代码语言:txt
复制
while i >= 0 and inorder[i] != prefix[0]:
代码语言:txt
复制
    i -= 1
代码语言:txt
复制
if i < 0:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(prefix[0])
代码语言:txt
复制
root.left = prefix_to_inorder(prefix[1:i+1], inorder[i+1:])
代码语言:txt
复制
root.right = prefix_to_inorder(prefix[i+1:], inorder[i+1:])
代码语言:txt
复制
return root

def build_prefix_tree(inorder, postorder):

代码语言:txt
复制
if not inorder or not postorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(postorder[-1])
代码语言:txt
复制
i = len(inorder)
代码语言:txt
复制
root.left = build_prefix_tree(inorder[:i], postorder[:i])
代码语言:txt
复制
root.right = build_prefix_tree(inorder[i+1:], postorder[i:-1])
代码语言:txt
复制
return root

def build_tree_from_inorder(inorder):

代码语言:txt
复制
if not inorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(inorder[0])
代码语言:txt
复制
i = 1
代码语言:txt
复制
while i < len(inorder) and inorder[i] == inorder[0]:
代码语言:txt
复制
    i += 1
代码语言:txt
复制
root.left = build_tree_from_inorder(inorder[1:i])
代码语言:txt
复制
root.right = build_tree_from_inorder(inorder[i:])
代码语言:txt
复制
return root

def inorder_to_tree(inorder):

代码语言:txt
复制
if not inorder:
代码语言:txt
复制
    return None
代码语言:txt
复制
root = TreeNode(inorder[0])
代码语言:txt
复制
i = 1
代码语言:txt
复制
while i < len(inorder) and inorder[i] == inorder[0]:
代码语言:txt
复制
    i += 1
代码语言:txt
复制
root.left = inorder_to_tree(inorder[1:i])
代码语言:txt
复制
root.right = inorder_to_tree(inorder[i:])
代码语言:txt
复制
return root

def inorder_to_tree_and_postorder(inorder

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

2.5K10

彻底用图解教会你——中缀表达式后缀和前缀

前缀表达式,运算符写在前面,操作数写在后面,像这样: * + 1 2 + 3 4 这就是上面那个括号的对应的前缀形式,可以看到括号已经没有了。...那么问题来了,如何中缀表达式转化为前、后缀表达式呢?...中缀表达式换为后缀表达式 表达式的转换要用到TokenReader和栈,TokenReader用来读取中缀表达式,一次读取一个Token。再准备两个栈,一个用红色标记,一个用绿色标记。...中缀后缀,先看视频,再看分步解析: 第一步、把中缀表达式装入TokenReader,并准备好从头部开始读取,如图15: ? 第二步、读取到左括号,压入绿栈,如图16: ?...中缀表达式换为前缀表达式 中缀前缀,先看视频,再看分步解析: 第一步、把中缀表达式装入TokenReader,并准备好从尾部开始读取,如图34: ?

6.1K30
  • 数据结构与算法-(7)---栈的应用-(3)表达式转换

    于是,我们引入全括号表达式: 在所有的表达式项两边都加上括号A+B*C+D,应表示为((A+(B*C))+D) 可否表达式中操作符的位置稍移动一下?...,让我们看看如何将其转换成前后缀表达式吧~ 中缀表达式换为前后缀形式的方法 ✨Summary: (1)中缀表达式换为括号形式 (2)所有的操作符移动到子表达式所在的...通用的中缀后缀算法⭐ 在中缀表达式换为后缀形式的处理过程中,操作符比操作数要晚输出 所以在扫描到对应的第二个操作数之前,需要把操作符先保存起来 而这些暂存的操作符,由于优先级的规则还有可能要反转次序输出...利用中缀后缀的操作流程 后面的算法描述中,约定中缀表达式是由空格隔开的一系列单词(token)构成, 操作符单词包括*/+-() 而操作数单词则是单字母标识符A、B、C等。...1.首先,创建空栈opstack用于暂存操作符,空表postfixList用于保存后缀表达式 2.中缀表达式换为单词(token)列表 A + B*C = split => ['A', '+

    13610

    五分钟小知识之什么是后缀表达式

    中缀表达式后缀表达式: 与转换为前缀表达式相似,步骤如下:   (1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;   (2)从左至右扫描中缀表达式;   (3)遇到操作数时,将其压s2;   ...(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);     c:否则, s1 栈顶的运算符弹出并压入到 s2 中,再次转到(4)-(1)与s1中新的栈顶运算符相比较;   (5)...遇到括号时:     a:如果是左括号“(”,则直接压入 s1;     b:如果是右括号“)”,则依次弹出 s1 栈顶的运算符,并压入 s2 ,直到遇到左括号为止,此时这一对括号丢弃;   (6)重复步骤...(2)至(5),直到表达式的最右边;   (7) s1 中剩余的运算符依次弹出并压入 s2;   (8)依次弹出 s2 中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序...) 例如,中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下: 扫描到的元素 s2(栈底->栈顶) s1 (栈底->栈顶) 说明 1 1 空 数字,直接入栈 + 1 + s1为空,运算符直接入栈

    2.7K20

    NOIP 2018提高组初赛CC++答案详解

    (一)后缀表达式(逆波兰表达式中缀表达式转换成后缀表达式的规则: (1)遇到操作数:直接输出(添加到后缀表达式中) (2)栈为空时,遇到运算符,直接入栈 (3)遇到左括号:将其入栈 (4)遇到右括号...a d * b c * - (二)前缀表达式(波兰表达式中缀表达式前缀表达式的规则: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时...,也运算符压入S1; (4-3) 否则,S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; (5) 遇到括号时: (5-1) 如果是右括号“)”,则直接压入S1;...(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时这一对括号丢弃; (6) 重复步骤(2)至(5),直到表达式的最左边; (7) S1中剩余的运算符依次弹出并压入...S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式

    2K40

    中缀表达式换为后缀表达式(逆波兰表达式)并对其求值

    中缀表达式后缀表达式思路: 1.初始化一个运算符栈s1和存储中间结果的List集合s2; 2.从左至右扫描中缀表达式(这里为了方便把中缀表达式字符串依次存放到数组中); 3.遇到操作数时,将其加到...s2,直到遇左括号为止,此时这一对括号丢弃; 6.重复2-5,直到表达式最右边 7.s1中剩余的运算符依次弹出并加入到s2 8.依次输出s2中的元素,结果即为中缀表达式对应的后缀表达式。...//中缀表达式换为后缀表达式并求值 import java.util.ArrayList; import java.util.List; import java.util.Stack; public...class InversePolishExpression { public static void main(String[] args) { //完成一个中缀表达式换为后缀表达式的功能...,则依次弹出s1栈顶运算符并压入s2,直到遇到左括号为止,此时这一对括号丢弃 while(!

    36330

    数据结构与算法-(7)---栈的应用拓展-前缀表达式转换+求值

    中缀后缀表达式的思路: 从左到右扫描逐个字符扫描中缀表达式的过程中,采用一个栈来暂存未处理的操作符 这样,栈顶的操作符就是最近暂存进去的,当遇到一个新的操作符,就需要跟栈顶的操作符比较下优先级...参考后缀表达式代码思路: 我们利用一个栈来进行中缀表达式前缀表达式的操作。其中prec{}是一个字典,用于记录操作符的优先级,优先级由低到高依次为1~3。...左括号--从操作符栈opStack中弹出并返回顶部元素topToken,直到遇到右括号为止。期间,所有弹出的操作符添加到前缀表达式列表prefixList中。...然后当前操作符压入操作符栈opStack中 (1)中缀表达式前缀 class Stack : def __init__(self): self.items = []...while not opStack.isEmpty(): # 操作符 prefixList.append(opStack.pop()) # 后缀表达式通过切片置合成前缀表达式字符串

    17010

    揭秘你处理数据的“底层逻辑”,详解公式引擎计算(一)

    首先我们进行词法分析,在这个过程中我们公式字符拆成字符串数组,在Excel表格公式计算中,表达式的公式字符串中只包括:运算符、符号、字符串、数字、数组、引用、名称这几类。...通常计算中语法分析可以采用表达式树或者堆栈(即逆波兰式)来处理。 这里我们先介绍表达式树的方法。 语法分析——表达式树 使用表达式树进行分析的过程,从一棵二叉树开始。...首先我们词法分析的结果按照优先级组成表达式树,表达式树的叶子结点就是操作数,内部节点是操作符。 在这个事例中,冒号的优先级最高,其次是括号,最后是除号。...语法分析——逆波兰算法 逆波兰算法是在语法分析阶段形成了一个堆栈(即逆波兰表达式),这个表达式的核心在于普通我们是用的中缀表达式换为后缀表达式。...括号在运算的过程中只进行运算顺序的提示,但并不是实际参与计算的元素内容,所以在中缀后缀的过程中就可以省略掉括号内容, 然后由计算机编写代码完成运算。 这里展示了一棵树转化成对应的逆波兰式的样子。

    1.8K20

    数据结构(8)栈的应用——求值表达式

    栈的应用——求值表达式 今天来写一下栈在求值表达式里的应用,这部分看了差不多一天了,具体原理基本懂了,代码实现部分只实现了无括号情况下的中缀表达式后缀表达式,因为没找到标准的C代码实现,所以一直自己摸索...表达式的分类 首先表达式分为三类,分别为: 中缀表达式 后缀表达式 前缀表达式 这里的中缀,前缀,后缀指的是运算符,中缀表达式就是运算符在两个操作数中间,后缀表达式就是运算符在两个操作数后面。...例如A+B,就是一个中缀表达式,转为前缀表达式就是+AB,后缀表达式就是AB+。求值表达式的问题可以转换为两个小问题,分别用栈实现。...其一是给出中缀表达式,转换为后缀表达式,其二是根据后缀表达式,求出表达式的值。...中缀表达式后缀表达式 代码实现 #include #include #define OK 1 #define ERROR 0 #define MaxSize

    33620

    六十四、前缀,后缀,中缀表达式转化求值问题

    :https://mp.weixin.qq.com/s/NRbFXZAXEUeXhKKYY7CReg 中缀表达式前缀表达式求值 中缀表达式前缀表达式的规则: 1、反转输入字符串,如“2*3/(2-1...: 17 中缀表达式换为后缀表达式求值 中缀表达式后缀表达式的规则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈; 4.遇到右括号,执行出栈操作,并将出栈的元素输出...13", "5", "/", "+"] 输出: 6 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6 前缀表达式中缀表达式 从右往左开始,取出一个操作符和操作符右边的两个数进行计算...以前缀表达式+/*23-21*3-41为例,将其转换为中缀表达式: (1)取出-、4、1,计算并将结果放回得到+/*23-21*3(4-1); (2)取出*、3、(4-1),计算并将结果放回得到+/*23...后缀表达式中缀表达式 从左向右开始,取出一个操作符和操作符左边的两个数进行计算,并将计算的结果放过去,直到计算结束,以后缀表达式23*21-/341-*+为例,将其转换为中缀表达式:(1)取出2、3、

    33910

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

    中缀后缀 本文大部分资料参考慕课何钦铭老师的数据结构 相关的慕课链接:表达式求值 中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级....当前运算符与最后一个等待的运算符比较....具体转换方式: 1.从左到右进行遍历 2.运算数,直接输出. 3.左括号,直接压入堆栈,(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈) 4.右括号,(意味着括号已结束...再来解释一下开始的简单例子 括号的运算 选取慕课里何钦铭老师的案例 后缀表达式运算步骤: (以堆栈储存) 从左到右,遇到运算符就弹出相应的运算数,运算后再把结果入栈.最终结果就是栈顶数的值...这篇文章只是整理中缀表达式后缀表达式的方法和理论,目的是为了理解. 具体代码实现看我的另一篇文章(模拟表达式运算). 这部分转换对于初学者来说可能很模糊,建议去看开头链接的那个视频.

    37320

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

    括号的混合运算:括号优先,乘除其次,加减最后; 当然,对于学习计算机的朋友而言,在我们实际进行的表达式求值时肯定不止'+'、'-'、'*'、'/'这四种运算符,这时我们就需要根据不同操作符的优先级来进行运算...当中缀表达式括号时,此时我们不仅要判断操作符的优先级,还需要处理括号,如下所示: 运算时,我们同样还是从左往右扫描,在这种情况下,我们在进行运算时的逻辑如下所示: 扫描到左界限符时,继续往右进行扫描...接下来我们就来通过代码实现表达式之间的相互转换; 3.3 算法实现 通过前面的算法设计,我们已经明确了我们的实现思路,如下所示: 对中缀表达式的扫描方向的选择: 中缀后缀:从左往右扫描; 中缀前缀...对于中缀前缀的代码的实现,有兴趣的朋友可以按照中缀后缀的思路进行代码的编写,只不过这里我需要提醒一下大家,扫描的方向别弄错咯! 结语 现在我们就介绍完了通过代码实现表达式转换的全部内容。...在今天的内容中我们详细探讨了实现表达式转换的具体过程,并最终确定了表达式转换实现的具体思路: 对中缀表达式的扫描方向的选择: 中缀后缀:从左往右扫描; 中缀前缀:从右往左扫描 对数据结构的选择:

    7510

    中缀表达式换为后缀表达式(C语言代码+详解)

    中缀表达式换为后缀表达式(思路) 1.创建栈 2.从左向右顺序获取中缀表达式 a.数字直接输出 b.运算符 情况一:遇到左括号直接入栈,遇到右括号栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出...情况四:获取完后,栈中剩余的运算符号依次弹栈输出 例:比如:2*(9+6/3-5)+4化为后缀表达式 2 9 6 3 / +5 – * 4 + 转换算法代码如下: /*中缀后缀函数*/ void...,弹出的左括号从新压栈,因为左 括号要和又括号匹配时弹出,这个后面单独讨论。...StackLength(S)) { return 0; } *c=*--S->top; return 1; } /*中缀后缀函数*/ void Change(SqStack *S,Elemtype...{ Elemtype str[MAXBUFFER]; SqStack S; gets(str); Change(&S,str); return 0; } 运行效果截图如下: 如何实现将中缀表达式转换成后缀表达式后计算值

    1.5K10

    C++ 不知树系列之表达式

    引言 在公众号里,写过与中缀、后缀表达式有关的文章,在文章中详细讲解了中缀表达式如何转换为后缀表达式以及如何求解后缀表达式。...为何还把后缀表达式换为二叉树,然后再在树的结构基础上求解,且不是饶了一个弯子,其实不然。...另受树相关算法的加持,也可以把后缀表达式的求解过程变得很易理解且具有艺术性。 2. 表达式树 如何把中缀表达式换为后缀表达式,此文不再负赘。仅讲解如何把后缀表达式换为表达式树,以及对表达式树求解。...现假设有如下后缀表达式:8571-*+82/-其中缀表达式为8+5*(7-1)-8/2。二叉树的构造过程如下: 2.1 构建流程 定义节点类型。...问题分析: 此问题给出的是中缀表达式,可以先转换为后缀表达式,然后再转换为表达式树,再进行求解。如果本题仅是求表达式的值,直接可以对中缀表达式求解,无须转换成后缀表达式

    33210

    表达式

    假设所有的运算符都是双目运算符,那么刚好形成一颗二叉树。我们可以通过递归计算左子树和右子树的值,从而得到整个表达式树的值。 ?...接着,我们来中序遍历这棵树,得到的表达式是这样的:a+b*c+d*e;(中缀表达式是我们最熟悉的表达式,但是有时候中序遍历产生的表达式是不符合预期的,一般我们可以通过递归产生一个括号的左表达式,然后打印根...,最后通过递归产生一个括号的右表达式。)...这样可以得到我们人喜欢使用的中缀表达式和计算机喜欢的后缀表达式。 构造一颗表达式树的算法:该算法描述的是一颗后缀表达式转换成表达式树的方法。...STACK main.cpp文件 #include "stack.h" int main() { PTree ET; ET = CreatExpTree(); cout << "中序遍历结果(中缀表达式

    98910

    算数四则混合运算表达式求值

    字符转换成数字(包括解析小数) 主要思路: 算术表达式有三种类型:前缀,中缀,后缀表达式,而这里主要利用的是中缀和后缀表达式 示图: 中缀表达式:运算符位于操作数中间 中缀表达式的运算规则...:“先乘除,后加减,从左到右计算,先括号内,后括号外” 即中缀表达式不仅要依赖运算符优先级,而且还要处理括号 后缀表达式:运算符在操作数的后面 已考虑了运算符的优先级,而且越放在前面的运算符来越优先执行...没有括号,只有操作数和运算符 我们平常使用的是中缀表达式,而后缀表达式运算的优先已经好了,所以我们用后缀表达式进行四则计算 步骤一:中缀表达式后缀表达式 示图: 过程实现...: 遍历中缀表达式 遇到数字直接放入后缀表达式 遇到左括号入栈 遇到右括号则将栈里的运算符一直出栈到左括号出栈,并按出栈顺序放入后缀表达式中(达到一个去括号的效果) 遇到 *...遍历结束后,栈顶的数据就是最后的结果 思考: 优先级:后缀表达式已经运算符的优先级给处理好了 字符浮点:从中缀表达式后缀时,遍历到数字或小数点则一直进行放入到后缀表达式中,并在最后放一个空格做分隔符

    79310

    栈在表达式求值中的应用——逆波兰表达式求值+中缀表达式后缀表达式

    我们去遍历给的逆波兰表达式对应的字符串数组,如果对应的元素是数字,我们就让该操作数入栈,如果遇到操作符,我们就去取栈顶的前两个元素(并pop掉)进行对应的运算(第一个是右操作数,第二个是左操作数),然后结果入栈...中缀表达式后缀表达式 那现在大家再来思考一个问题: 如果给我们一个中缀表达式,我们如何把它转换成对应的后缀表达式? 分析 那中缀后缀呢,也是需要借助一个栈,具体怎么做呢?...比如现在有这样一个中缀表达式1+2*3-4 怎么把它转成后缀呢?...遍历结束后,如果栈不为空,剩余操作符输出。 此时,就得到对应的后缀表达式了。 但是,如果是括号的情况呢? 比如1+2*(4-5)+6/7,怎么处理?...中缀表达式求值 那大家再来思考一下,如果给一个中缀表达式,我们该如何求它的值呢? ,是不是就是上面两种操作的结合啊。

    10110

    数据结构基础温故-4.树与二叉树(下)

    数学表达式求值是程序设计语言编译中的一个基本问题,表达式求值是栈应用的一个典型案例,表达式分为前缀、中缀和后缀三种形式。这里,我们通过一个四则运算的应用场景,借助二叉树来帮助求解表达式的值。...首先,表达式换为二叉树,然后通过先序遍历二叉树的方式求出表达式的值。 一、二叉树如何表示四则运算 1.1 表达式换为二叉树 ?   ...SUMMARY:从以上过程中我们可以表达式树的建立算法归结如下 ①第一个节点先成为表达式树的根; ②第二个节点插入时变为根节点,原根节点变为新节点的左孩子; ③插入节点为数字时,沿着根节点右链插入到最右端...while(_pos < _expression.Length) { Node node = GetNode(); // 当前解析字符转换为节点...2.4 四则运算运行结果   由于本表达式树的设计较为简单,没有考虑到括号的情形,因此这里只用不带括号表达式进行查看,运行结果如下图所示:   (1)3+2*9-16/4 ?

    72220

    前缀、中缀、后缀表达式

    中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式换为前缀或后缀表达式,然后再进行求值。...中缀表达式换为前缀表达式: 遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,...例如,中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下: 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 5 5 空 数字,直接入栈 - 5 - S1为空,运算符直接入栈...中缀表达式换为后缀表达式: 与转换为前缀表达式相似,遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,将其压入S2;...例如,中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下: 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 1 1 空 数字,直接入栈 + 1 + S1为空,运算符直接入栈

    1.1K10

    计算器:中缀表达式后缀表达式

    这几天想写一个Android的计算器,所以先写好中缀表达式到后缀表达式的计算。...例如:中缀表达式(8+9*10)-4/2+3 我们可以进行如下操作: 1、每个操作符对应的两个操作数用括号括上(((8+(9*10))-(4/2))+3) 2、操作符移到对应的括号外(((8(...910*)+)(42)/)-3)+ 3、去掉括号即可  8910*+42/-3+ 是不是很简单,这样我们就讲一个中缀表达式转换成论文后缀表达式。...转换的整体流程如下: 中缀表达式后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作...* @return * 中缀表达式换为后缀表达式 */ public Queue toSuffix(String expression) {

    2.2K10
    领券