📜  数据结构 |堆栈 |问题 4(1)

📅  最后修改于: 2023-12-03 15:10:19.691000             🧑  作者: Mango

数据结构 | 堆栈 | 问题 4
问题描述

给定一个仅包含数字的字符串,使用堆栈数据结构对其进行求值。字符串仅包含以下字符:

  • 数字 0-9
  • 运算符 +、-、*、/
  • 左括号 (
  • 右括号 )
示例

输入

"1 + 2 * 3"

输出

7

实现思路

堆栈数据结构是一种非常适合对表达式进行求值的数据结构。具体实现思路如下:

  1. 创建两个堆栈 S 和 O,其中 S 存储操作数,O 存储运算符。
  2. 遍历表达式中的每一个元素:
    1. 如果该元素是数字,将其压入 S。
    2. 如果该元素是左括号,将其压入 O。
    3. 如果该元素是右括号,以 O 中的元素为运算符,将 S 中的两个元素弹出,并将运算结果压入 S,直到弹出的运算符为左括号为止。
    4. 如果该元素是运算符,则首先将 O 中所有优先级大于等于该运算符的运算符依次弹出,并根据弹出的运算符从 S 中弹出两个元素进行运算,并将运算结果压入 S,最后将该运算符压入 O。
  3. 遍历完表达式后,依次弹出 O 中的所有元素,并根据弹出的运算符从 S 中弹出两个元素进行运算,并将运算结果压入 S。最终 S 中剩下的元素即为表达式的求值结果。
代码实现
def eval(expression):
    # 定义运算符优先级
    priority = {'+': 1, '-': 1, '*': 2, '/': 2}
    # 定义操作数堆栈 S 和运算符堆栈 O
    S, O = [], []
    # 遍历表达式中的每一个元素
    for elem in expression:
        if elem.isdigit():
            # 如果该元素是数字,将其压入 S
            S.append(int(elem))
        elif elem == '(':
            # 如果该元素是左括号,将其压入 O
            O.append(elem)
        elif elem == ')':
            # 如果该元素是右括号
            while O[-1] != '(':
                operator = O.pop()
                operand2, operand1 = S.pop(), S.pop()
                if operator == '+':
                    result = operand1 + operand2
                elif operator == '-':
                    result = operand1 - operand2
                elif operator == '*':
                    result = operand1 * operand2
                elif operator == '/':
                    result = operand1 / operand2
                S.append(result)
            O.pop()
        else:
            # 如果该元素是运算符
            while len(O) > 0 and priority[O[-1]] >= priority[elem]:
                operator = O.pop()
                operand2, operand1 = S.pop(), S.pop()
                if operator == '+':
                    result = operand1 + operand2
                elif operator == '-':
                    result = operand1 - operand2
                elif operator == '*':
                    result = operand1 * operand2
                elif operator == '/':
                    result = operand1 / operand2
                S.append(result)
            O.append(elem)
    # 处理剩余运算符
    while len(O) > 0:
        operator = O.pop()
        operand2, operand1 = S.pop(), S.pop()
        if operator == '+':
            result = operand1 + operand2
        elif operator == '-':
            result = operand1 - operand2
        elif operator == '*':
            result = operand1 * operand2
        elif operator == '/':
            result = operand1 / operand2
        S.append(result)
    # 返回表达式的求值结果
    return S.pop()
总结

本文介绍了如何使用堆栈数据结构对表达式进行求值,并给出了具体实现思路和代码实现。堆栈数据结构在表达式求值中有着广泛的应用,读者可以在实际编程中尝试应用此方法。