数据结构与算法之 leetcode 栈表达式求值 中缀 / 后缀表达式

数据结构与算法阿木 发布于 7 天前 3 次阅读


摘要:

表达式求值是计算机科学中常见的一个问题,特别是在编程语言和算法设计中。本文将围绕栈这一数据结构,探讨中缀表达式和后缀表达式的计算原理,并分别给出相应的代码实现。通过对比两种表达式的计算过程,我们可以更好地理解栈在算法中的应用。

一、

表达式求值是计算机科学中的一项基本技能,它涉及到如何将数学表达式转换为计算机可以理解和执行的形式。中缀表达式(如:3 + 4 2)和后缀表达式(如:3 4 2 +)是两种常见的表达式形式。本文将重点介绍如何使用栈来计算这两种表达式的值。

二、中缀表达式求值

中缀表达式是人们最常用的数学表达式形式,其中运算符位于两个操作数之间。计算中缀表达式的值需要遵循运算符的优先级和结合律。

1. 运算符优先级

在计算中缀表达式时,我们需要考虑运算符的优先级。乘法和除法的优先级高于加法和减法。

2. 结合律

运算符的结合律指的是在优先级相同的情况下,运算符的左右结合方式。例如,加法和减法是左结合的,而乘法和除法是右结合的。

3. 栈的应用

为了计算中缀表达式的值,我们可以使用两个栈:一个用于存储操作数,另一个用于存储运算符。

以下是中缀表达式求值的Python代码实现:

python

def calculate(infix_expr):


def precedence(op):


if op in ('+', '-'):


return 1


if op in ('', '/'):


return 2


return 0

def apply_operator(operators, values):


operator = operators.pop()


right = values.pop()


left = values.pop()


if operator == '+':


values.append(left + right)


elif operator == '-':


values.append(left - right)


elif operator == '':


values.append(left right)


elif operator == '/':


values.append(left / right)

operators = []


values = []


i = 0


while i < len(infix_expr):


if infix_expr[i] == ' ':


i += 1


continue


elif infix_expr[i] == '(':


operators.append(infix_expr[i])


elif infix_expr[i].isdigit():


j = i


while j < len(infix_expr) and infix_expr[j].isdigit():


j += 1


values.append(int(infix_expr[i:j]))


i = j - 1


elif infix_expr[i] == ')':


while operators and operators[-1] != '(':


apply_operator(operators, values)


operators.pop() Remove '(' from stack


else:


while (operators and


precedence(operators[-1]) >= precedence(infix_expr[i])):


apply_operator(operators, values)


operators.append(infix_expr[i])


i += 1

while operators:


apply_operator(operators, values)

return values[0]

Example usage


infix_expr = "3 + 4 2 / ( 1 - 5 ) ^ 2 ^ 3"


print(calculate(infix_expr))


三、后缀表达式求值

后缀表达式(也称为逆波兰表达式)是一种不需要括号和运算符优先级的表达式形式。计算后缀表达式的值相对简单,因为每个运算符后面直接跟有两个操作数。

1. 栈的应用

计算后缀表达式时,我们同样使用一个栈来存储操作数。

以下是后缀表达式求值的Python代码实现:

python

def calculate_postfix(postfix_expr):


def apply_operator(operators, values):


operator = operators.pop()


right = values.pop()


left = values.pop()


if operator == '+':


values.append(left + right)


elif operator == '-':


values.append(left - right)


elif operator == '':


values.append(left right)


elif operator == '/':


values.append(left / right)

operators = []


values = []


i = 0


while i < len(postfix_expr):


if postfix_expr[i].isdigit():


j = i


while j < len(postfix_expr) and postfix_expr[j].isdigit():


j += 1


values.append(int(postfix_expr[i:j]))


i = j - 1


else:


apply_operator(operators, values)


i += 1

return values[0]

Example usage


postfix_expr = "3 4 2 1 5 - 2 3 ^ ^ / +"


print(calculate_postfix(postfix_expr))


四、总结

本文介绍了使用栈来计算中缀表达式和后缀表达式的值。通过分析两种表达式的特点,我们实现了相应的计算算法。在实际应用中,这两种表达式求值方法在编译器设计、表达式解析等领域有着广泛的应用。

在编写代码时,我们需要注意以下几点:

1. 正确处理空格和非法字符。

2. 考虑运算符的优先级和结合律。

3. 使用栈来存储操作数和运算符。

通过本文的学习,读者可以更好地理解栈在算法中的应用,并能够在实际项目中灵活运用。