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

向表达式解析器添加中缀运算符

向表达式解析器添加中缀运算符是一个常见的编程任务,涉及到编译原理中的词法分析和语法分析。以下是关于这个问题的详细解答:

基础概念

中缀运算符是指位于操作数之间的运算符,例如 +-*/ 等。表达式解析器的主要任务是将输入的字符串表达式转换为可计算的形式,通常是抽象语法树(AST)。

相关优势

  1. 易读性:中缀表达式更符合人类的阅读习惯。
  2. 灵活性:支持各种复杂的数学和逻辑运算。
  3. 广泛使用:大多数编程语言和计算器都采用中缀表达式。

类型

常见的中缀运算符包括:

  • 算术运算符:+, -, *, /, %
  • 关系运算符:==, !=, <, >, <=, >=
  • 逻辑运算符:&&, ||, !
  • 位运算符:&, |, ^, <<, >>

应用场景

  • 计算器应用:用于解析用户输入的数学表达式。
  • 编程语言解释器:用于解析源代码中的表达式。
  • 公式编辑器:用于处理复杂的数学公式。

实现步骤

  1. 词法分析:将输入字符串分解成 tokens(如数字、运算符、括号等)。
  2. 语法分析:将 tokens 转换为抽象语法树(AST)。
  3. 计算:遍历 AST 进行计算。

示例代码

以下是一个简单的 Python 示例,展示如何向表达式解析器添加中缀运算符:

代码语言:txt
复制
import re
from typing import List, Union

class Token:
    def __init__(self, type: str, value: Union[str, int]):
        self.type = type
        self.value = value

def tokenize(expression: str) -> List[Token]:
    tokens = []
    token_specification = [
        ('NUMBER',   r'\d+(\.\d*)?'),  # Integer or decimal number
        ('OPERATOR', r'[+*/()-]'),     # Arithmetic operators
        ('SKIP',     r'\s+'),          # Skip over spaces
    ]
    tok_regex = '|'.join(f'(?P<{pair[0]}>{pair[1]})' for pair in token_specification)
    for mo in re.finditer(tok_regex, expression):
        kind = mo.lastgroup
        value = mo.group(kind)
        if kind == 'NUMBER':
            value = float(value) if '.' in value else int(value)
        elif kind == 'SKIP':
            continue
        tokens.append(Token(kind, value))
    return tokens

def parse(tokens: List[Token]) -> 'Expression':
    # This is a simplified example; a real parser would be more complex
    class Expression:
        def evaluate(self) -> float:
            raise NotImplementedError
    
    class NumberExpression(Expression):
        def __init__(self, value: float):
            self.value = value
        
        def evaluate(self) -> float:
            return self.value
    
    class BinaryOperation(Expression):
        def __init__(self, left: Expression, operator: str, right: Expression):
            self.left = left
            self.operator = operator
            self.right = right
        
        def evaluate(self) -> float:
            left_value = self.left.evaluate()
            right_value = self.right.evaluate()
            if self.operator == '+':
                return left_value + right_value
            elif self.operator == '-':
                return left_value - right_value
            elif self.operator == '*':
                return left_value * right_value
            elif self.operator == '/':
                return left_value / right_value
            else:
                raise ValueError(f"Unknown operator: {self.operator}")
    
    # Simple recursive descent parser
    def parse_expression(index: int) -> (Expression, int):
        token = tokens[index]
        if token.type == 'NUMBER':
            return NumberExpression(token.value), index + 1
        elif token.type == 'OPERATOR':
            left, index = parse_expression(index - 1)
            right, index = parse_expression(index + 1)
            return BinaryOperation(left, token.value, right), index
        else:
            raise ValueError(f"Unexpected token: {token}")
    
    ast, _ = parse_expression(0)
    return ast

# Example usage
expression = "3 + 5 * (10 - 6)"
tokens = tokenize(expression)
ast = parse(tokens)
result = ast.evaluate()
print(f"Result: {result}")  # Output: Result: 23.0

可能遇到的问题及解决方法

  1. 优先级处理:中缀运算符有不同的优先级(如乘法优先于加法)。解决方法是在解析时使用递归下降算法或运算符优先级解析(Shunting Yard算法)。
  2. 左结合和右结合:某些运算符是左结合的(如加法),而某些是右结合的(如赋值)。解决方法是在解析时正确处理运算符的结合性。
  3. 错误处理:输入表达式可能包含非法字符或语法错误。解决方法是在词法分析和语法分析阶段添加适当的错误检查和处理逻辑。

通过上述步骤和示例代码,你可以向表达式解析器添加中缀运算符,并处理相关的常见问题。

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

相关·内容

栈(Stack) 原

现实生活中使用的是中缀表达式,计算机内存储表达式时一般采用后缀或前缀表达式。 一个表达式通常由操作数、运算符及分隔符所构成。...中缀表达式就是将运算符放在操作数中间,例如:a+b*c 由于运算符有优先级,所以在计算机内部使用中缀表达式是非常不方便的。...利用堆栈处理中缀表达式的步骤如下: 第一步:设置两个堆栈,一个操作数堆栈和一个运算符堆栈。 第二步:初始时为空,读取表达式时,只要督导操作数,将操作数压入操作数栈。...中缀表达式的计算需要使用两个堆栈,并且计算比较频繁,而后缀或前缀表达式的实现只需要一个堆栈。 将中缀表达式转换为后缀表达式,转换原则如下: 第一:从左至右读取一个中缀表达式。...第四:当表达式已经读取完成,而堆栈中尚有运算符时,则依次序取出运算符,知道堆栈为空,由此得到的结果就是中缀表达式转换成的后缀表达式。

72920

Python数据结构与算法笔记(2)

中缀表达式和后缀表达式 A+B*C中缀表达式,将运算符放在后面A B C * + 后缀表达式,*紧接着在B和C之后出现,表示*具有高的优先级,+优先级低。 ?...中缀转后缀通用法: 当我们处理表达式时,操作符必须保存在某处,因为他们相应的右操作数还没有看到。此外,这些保存的操作符的顺序可能由于它们的优先级而需要翻转。...这是在该示例中的加法和乘法的情况,由于加法运算符在乘法运算符之前,并且具有较低的优先级,因此需要在使用乘法运算符之后出现,由于这种顺序的翻转,考虑使用栈来保存运算符直到用到它们是有意义的 假设中缀表达式是一个由空格分隔的标记字符串...创建一个名为opstack的空栈以保存运算符。给输出创建一个空列表。 2. 通过使用字符串方法拆分将输入的中缀字符串转换为标记列表 3. 从左到右扫描标记列表。...后缀表达式求值: 在扫描后缀表达式时,必须等待操作数,另一种方法是每当在输入上看到运算符时,计算两个最近的操作数。 假设后缀表达式是一个由空格分隔的标记字符串。

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

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

    82510

    Swift后缀表达式(逆波兰式)转换计算

    --more--> 这里采用中缀表达式转后缀表达式,然后计算后缀表达式得出结果,步骤如下。 Swift 中缀表达式转后缀表达式 什么是中缀表达式、后缀表达式?...首先理解中缀表达式和后缀表达式分别是什么? 中缀表达式: 是常用的算术表示方法,操作符处于操作数的中间,比如 (a + b),即中缀形式,故而称之为中缀表达式。...后缀表达式: 运算符写在操作数之后,比如 (a, b, +),称之为后缀表达式,又名逆波兰式。 为什么要把中缀表达式转为后缀表达式? 为什么要将简单的中缀表达式转为后缀表达式呢?...,故而"/"从运算符数组中弹出,添加到数字数组中。...// 再次比较"-"优先级不高于运算符数组中最后一个元素"+",故而"+"从运算符数组中弹出,添加到数字数组中。

    63420

    向表达式添加括号后的最小结果

    请你向 expression 中添加一对括号,使得在添加之后, expression 仍然是一个有效的数学表达式,并且计算后可以得到 最小 可能值。...左括号 必须 添加在 '+' 的左侧,而右括号 必须 添加在 ‘+’ 的右侧。 返回添加一对括号后形成的表达式 expression ,且满足 expression 计算得到 最小 可能值。...示例 1: 输入:expression = "247+38" 输出:"2(47+38)" 解释:表达式计算得到 2 * (47 + 38) = 2 * 85 = 170 。...示例 2: 输入:expression = "12+34" 输出:"1(2+3)4" 解释:表达式计算得到 1 * (2 + 3) * 4 = 1 * 5 * 4 = 20 。...示例 3: 输入:expression = "999+999" 输出:"(999+999)" 解释:表达式计算得到 999 + 999 = 1998 。

    36920

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

    回顾+思路讲解 之前我们介绍过了什么是后缀表达式,以及它如何通过中缀表达式进行转换,以及关于后缀表达式的求值问题,如有遗忘http://t.csdnimg.cn/Hl4Y9 今天我们拓展一下,前缀表达式的转换和求值问题...中缀转后缀表达式的思路: 从左到右扫描逐个字符扫描中缀表达式的过程中,采用一个栈来暂存未处理的操作符 这样,栈顶的操作符就是最近暂存进去的,当遇到一个新的操作符,就需要跟栈顶的操作符比较下优先级...,不过 中缀表达式中运算符的优先级和结合性需要考虑,从左往右扫描的话,需要对每个运算符的优先级和结合性进行判断,才能决定是否需要先进行计算。...另外,从右往左扫描还可以处理右结合性的运算符。 参考后缀表达式代码思路: 我们利用一个栈来进行中缀表达式转前缀表达式的操作。...如果当前操作符的优先级小于等于栈顶操作符的优先级,我们就将栈顶操作符弹出并添加到前缀表达式列表prefixList中。

    21010

    表达式(四则运算)计算的算法

    ,运算符总是在两个操作数中间(除),如(A+B)*C,这样的表达式叫做中缀表达式。...编译系统中对中缀形式的算术表达式的处理方式是: 先把中缀表达式转换成后缀表达式,再进行计算。 后缀表达式就是表达式中的运算符出现在操作数的后面,并且不含括号,如AB+C*。...后缀表达式的特点: (1).后缀表达式让操作数和中缀表达式的操作数先后次序相同,只是运算符的先后次序改变; (2).后缀表达式没有括号,运算次序就是其执行次序。...(3).令x1为当前栈顶运算符的变量,x2为当前扫描读到的运算符的变量,当顺序从中缀表达式中读入的单词为运算符时就赋予x2;然后比较x1与x2的优先级,若优先级x1>x2,将x1从S中出栈,并加入L中,...为(或/时,优先级x1中缀表达式规则2.先括号内后括号外;当x1的运算符x2的运算符同级别时,优先级x1=x2,满足中缀表达式规则3.同级别时先左后右。

    3.1K10

    JS实现简易的计算器

    - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 所以为了实现程序的自动运算,我们需要将输入的数据转化为前缀或后缀表达式 前缀、中缀、后缀表达式的概念以及相互转换方法在这里就不多说了...S2; (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈...,此时将这一对括号丢弃; (6) 重复步骤(2)至(5),直到表达式的最右边; (7) 将S1中剩余的运算符依次弹出并压入S2; (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式...监听数据,获取到的只是页面上的某个值/操作符,所以需要将数据存储起来形成中缀,再由中缀转换成后缀,最后通过后缀进行计算 // 中缀表达式 this.infix = [];...,要考虑的就更多了,比如连续的连续运算符、连续的数字、运算符+ - 接上数字表示正负数,小数点的连接存取等 // 添加操作,首先得判断运算符是否重复 else

    11.1K10

    Kotlin 的 val list: ArrayList= ArrayList() 居然报错!

    2 分析 Kotlin 的解析过程 这么说来就比较有意思了,Kotlin 的解析器并不会因为前面有泛型而把后面的 >= 识别成 > = ,难道是说在解析的过程中,先通过词法分析器把一个个字符识别成一个个...我们看下调用堆栈,解析器被调用的地方实际上是 PsiElement 构造的过程中。我们再来看看 doParseContents 这个方法是干什么的: ?...先说说 Scala,它的解析器应该是极其强大的,毕竟人家允许各种字符作为运算符啊。。 ? 嗯,毕竟人家的泛型参数机智地选择了 [] 而不是 ,OK,你赢了。。...4 一些思考 实际上通过前面的讨论,我们就知道为什么 Kotlin 的移位居然不用 >> 和 中缀表达式,毕竟人家没办法识别呀。。...而说到移位用中缀表达式的问题,我们群里有位大佬就终于忍不住为 Kotlin 发声了: 用中缀这种方法未尝不好啊。因为其实位移这种根本没什么人用的,直接换成一个方法其实在概念理解上简单多了。

    1.3K10

    C++ 使用栈求解中缀、后缀表达式的值

    为了简化问题,本文只限于讨论基于常量操作数和双目运算符的表达式。 在计算机中,表达式的描述可以有以下 3 种: 后缀表达式:操作数,操作数,运算符。 中缀表达式:操作数,运算符,操作数。...前缀表达式:运算符,操作数,操作数。 本文将讨论后缀表达式和中缀表达式的计算过程。 2....中缀表达式 平常所见最多的表达式是中缀表达式,如下所示: 4*6^(3+3*3-2*3)-8 对中缀表达式求值时需要创建 2 个栈。 一个用来存储运算符的栈 optStack。...中缀转后缀表达式 虽然后缀表达式的计算过程要比中缀表达式简单很多,前提条件是要先把中缀表达式转换成后缀表达式。 转换流程: 初始化一个运算符栈。...4.1 流程演示 如下把8+5*(7-1)-8/2 中缀表达式转换成后缀表达式。 初始化运算符栈。 扫描中缀表达式,字符8直接输出,+是第一个操作数,因可能后续有更高的运算符,入栈。

    86800

    前缀、中缀、后缀表达式

    它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。...举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法...中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。...将中缀表达式转换为前缀表达式: 遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,...将中缀表达式转换为后缀表达式: 与转换为前缀表达式相似,遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,将其压入S2;

    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.3K10

    C++ 常规题目之双栈求解中缀表达式

    表达式求值对于有知识经验的人类而言,可以通过认知,按运算符的优先级进行先后运算。但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则。这个过程则需要借助于栈来实现。...表达式由 2 部分组成: 操作数。 运算符。 在一个复杂的表达式中,操作数和运算符可以有多个,运算符之间存在优先级,且不同运算符所需要的操作数的数量也有差异。这时,表达式的计算过程就变得较复杂。...为了简化问题,本文只限于讨论基于常量操作数和双目运算符的表达式。 在计算机中,表达式的描述可以有以下 3 种: 后缀表达式:操作数,操作数,运算符。 中缀表达式:操作数,运算符,操作数。...前缀表达式:运算符,操作数,操作数。 本视频讲解中缀表达式的求解流程。 可以在解析中缀表达式对之求解,也可以把中缀表达式转换成后缀表达式后再求解。

    15110

    前缀、中缀、后缀表达式

    所谓前缀、中缀、后缀表达式,它们之间的区别在于运算符相对与操作数的位置不同,为了说明它们的概念,首先来看一下中缀表达式。...中缀表达式 中缀表达式又称为中缀记法,操作符以中缀形式处于操作数的中间。...前缀、中缀、后缀表达式相互转换 将中缀表达式转换为前缀表达式 遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时...中剩余的运算符依次弹出并压入S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。...将中缀表达式转换为后缀表达式 与转换为前缀表达式相似,遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,将其压入

    1.1K50

    《流畅的Python》第十三章学习笔记

    运算符重载的作用是让用户定义的对象使用中缀运算符或一元运算符 中缀运算符 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法...与前缀表达式(例:+34)或后缀表达式(例:34+)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。 ?...中缀运算符 一元运算符 一元运算符只对一个表达式执行操作,该表达式可以是数值数据类型类别中的任何一种数据类型。...Python对运算符重载的限制 不能重载内置类型的运算符 不能新建运算符,只能重载现有的 某些运算符不能重载:is、and、or和not 一元运算符处理方式 支持一元运算符,只需要实现相应的特殊方法。...比较运算符 增量赋值运算符 增量赋值运算符不会修改不可变目标,而是新建实例,然后重新绑定

    51610

    前缀、中缀、后缀表达式

    前缀、中缀、后缀表达式,它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。...对计算机来说中缀表达式是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。...举例: (3 + 4) × 5 - 6  中缀表达式 - × + 3 4 5 6  前缀表达式 3 4 + 5 × 6 -  后缀表达式 前缀表达式的求值: 从右至左扫描表达式,遇到数字时,将数字压入堆栈...,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。...后缀表达式求值: 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果

    85670

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

    一般我们接触比较熟悉的是 中缀表达式 。 中缀表达式是常见的运算表达式,如 ( 3 + 4 ) × 5 - 6 。中缀表达式在我们日常生活中应用最为广泛,也最符合人的计算思维。...例如:中缀表达式 ( 2 + 3 ) × 4 - 5,采用前缀表达式为:- × + 2 3 4 5 前缀表达式运算: •对前缀表达式进行从右至左依次扫描•当遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数...5 和 4 ,计算出 5 × 4 = 20,将 20 入栈•最后是 - 运算符,计算出 20 - 5 的值,即 15,由此得出最终计算结果 中缀表达式转为前缀表达式: 转换步骤如下: •(1)初始化两个栈...:运算符栈 s1,储存中间结果的栈 s2•(2)从右至左扫描中缀表达式•(3)遇到操作数时,将其压入 s2•(4)遇到运算符时,比较其与 s1 栈顶运算符的优先级 •a:如果 s1 为空,...,结果即为中缀表达式对应的前缀表达式。

    1.7K20

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

    中缀表达式转后缀表达式思路: 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) { //完成一个将中缀表达式转换为后缀表达式的功能...,遇到运算符弹出栈顶的两个数,用运算符对他们进行相应的计算并将结果入栈;重复上述过程直到表达式最右端,最后得出的值即为表达式结果(后缀表达式的剑法和除法运算是栈底元素- or / 栈顶元素)。

    37830

    golang 计算器实现

    其运算方式为:如果当前字符(或字符串)为数字或变量,则压入栈内;如果是运算符,则将栈顶两个元素弹出栈外并作相应运算,再将结果压入栈内。当前缀表达式扫描结束时,栈里的就是中缀表达式运算的最终结果。...,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 * 计算机实现转换:   将中缀表达式转换为后缀表达式的算法思想:   ·开始扫描...;   ·数字时,加入后缀表达式;   ·运算符:   a....若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出现'(',从栈中删除'(' ;   c.剩下的运算符中, 若其优先级高于其它所有的运算符,直接入栈。...·当扫描的中缀表达式结束时,栈中的的所有运算符出栈;    人工实现转换   这里我给出一个中缀表达式:a+b*c-(d+e)   第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+

    82220

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

    中缀表达式如1*2+(2-1), 其运算符一般出现在操作数之间, 因此称为中缀表达式,也就是大家编程中写的表达 式。...编译系统不考虑表达式的优先级别, 只是对表达式从左到右进行扫描, 当遇到运算符时, 就把其前面的两 个操作数取出, 进行操作。...为达到上述目的, 就要将中缀表达式进行改写,变为后缀表达式 如上面的表达式 1*2+(2-1), 就变为12*21-+; 后缀表达式中不含有括号, 且后缀表达式的操作数和中缀表达式的操作数排列次序完全相同...其中stack op;用来存放运算符栈。数组ans用来存放后缀表达式。 算法思想: 从左到右扫描中缀表达式,是操作数就放进数组ans的末尾。...2)如果是‘)’,依次从op栈弹出运算符加到数组ans的末尾,知道遇到’(’; 3) 如果是非括号,比较扫描到的运算符,和op栈顶的运算符。如果扫描到的运算符优先级高于栈顶运算符 则,把运算符压入栈。

    40610
    领券