数据结构与算法之数据结构 栈应用 表达式求值 / 函数调用 案例

数据结构与算法阿木 发布于 2025-07-11 10 次阅读


摘要:

栈是一种先进后出(Last In First Out,LIFO)的数据结构,在计算机科学中有着广泛的应用。本文将探讨栈在表达式求值和函数调用中的应用,通过具体的代码实现来展示栈的强大功能。

一、

表达式求值和函数调用是编程语言中常见的操作,而栈作为一种基本的数据结构,在这些操作中扮演着重要的角色。本文将分别从这两个方面介绍栈的应用,并通过代码示例进行详细说明。

二、表达式求值

表达式求值是计算机科学中的一个基本问题,它涉及到如何将一个数学表达式转换为等价的数值。在表达式求值中,栈可以用来处理运算符和操作数。

1. 算法描述

(1)初始化两个栈:一个用于存储操作数(数值栈),另一个用于存储运算符(符号栈)。

(2)从左到右扫描表达式,遇到操作数时,将其压入数值栈。

(3)遇到运算符时,比较其优先级:

a. 如果符号栈为空或栈顶元素为左括号,则将运算符压入符号栈。

b. 如果当前运算符的优先级高于栈顶运算符的优先级,则将当前运算符压入符号栈。

c. 如果当前运算符的优先级低于或等于栈顶运算符的优先级,则从数值栈中弹出两个操作数,从符号栈中弹出栈顶运算符,执行运算,并将结果压入数值栈。

(4)当表达式扫描完毕后,如果符号栈中还有运算符,则依次执行步骤(3)c的操作。

(5)数值栈中的栈顶元素即为表达式的结果。

2. 代码实现

python

def calculate(expression):


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(expression):


if expression[i] == ' ':


i += 1


continue


elif expression[i] == '(':


operators.append(expression[i])


elif expression[i].isdigit():


j = i


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


j += 1


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


i = j - 1


elif expression[i] == ')':


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


apply_operator(operators, values)


operators.pop() Remove '(' from stack


else:


while (operators and precedence(operators[-1]) >= precedence(expression[i])):


apply_operator(operators, values)


operators.append(expression[i])


i += 1

while operators:


apply_operator(operators, values)

return values[0]

Example usage


expression = "3 + 5 ( 6 - 2 ) / 4 "


result = calculate(expression)


print("Result:", result)


三、函数调用

在函数调用中,栈被用来存储函数调用的上下文,包括局部变量、参数、返回地址等信息。

1. 算法描述

(1)当函数被调用时,创建一个新的栈帧(Stack Frame)来存储函数的局部变量和参数。

(2)将栈帧压入调用栈(Call Stack)。

(3)执行函数体,将局部变量和参数压入栈帧。

(4)当函数返回时,从调用栈中弹出栈帧,恢复调用前的状态。

2. 代码实现

在大多数编程语言中,函数调用和栈的使用是由编译器和运行时环境自动处理的。以下是一个简单的函数调用示例,展示了栈帧的概念:

python

def factorial(n):


if n == 0:


return 1


else:


return n factorial(n - 1)

调用函数


result = factorial(5)


print("Factorial of 5:", result)


在上述代码中,每次调用`factorial`函数时,都会创建一个新的栈帧来存储局部变量`n`和返回地址。当递归调用结束时,栈帧被弹出,返回到上一个调用栈帧。

四、总结

本文介绍了栈在表达式求值和函数调用中的应用。通过具体的代码实现,展示了栈在处理这些操作时的优势。栈作为一种基本的数据结构,在计算机科学中有着广泛的应用,掌握其原理和应用对于程序员来说至关重要。