Python 利用栈轻松计算含括号、四则及乘方运算的复杂算术表达式
下面是一个使用栈来计算算术表达式的Python算法: ```python # 定义运算符的优先级 precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} # 定义栈类 class Stack: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] # 定义函数来判断一个字符是否是运算符 def is_operator(char): return char in ['+', '-', '*', '/', '^'] # 定义函数来计算两个操作数的结果 def apply_operator(operator, b, a): if operator == '+': return a + b elif operator == '-': return a - b elif operator == '*': return a * b elif operator == '/': return a / b elif operator == '^': return a b # 定义函数来计算算术表达式的值 def evaluate(expression): operand_stack = Stack() operator_stack = Stack() # 遍历表达式中的每个字符 for char in expression: # 如果是一个数字,则将它压入操作数栈 if char.isdigit(): operand_stack.push(int(char)) # 如果是一个左括号,则将它压入运算符栈 elif char == '(': operator_stack.push(char) # 如果是一个右括号,则执行栈中所有的运算符,直到遇到左括号 elif char == ')': while not operator_stack.is_empty() and operator_stack.peek() != '(': operator = operator_stack.pop() b = operand_stack.pop() a = operand_stack.pop() result = apply_operator(operator, b, a) operand_stack.push(result) operator_stack.pop() # 弹出左括号 # 如果是一个运算符,则执行栈中所有优先级更高或相等的运算符 elif is_operator(char): while not operator_stack.is_empty() and precedence[char] <= precedence[operator_stack.peek()]: operator = operator_stack.pop() b = operand_stack.pop() a = operand_stack.pop() result = apply_operator(operator, b, a) operand_stack.push(result) operator_stack.push(char) # 执行栈中剩余的运算符 while not operator_stack.is_empty(): operator = operator_stack.pop() b = operand_stack.pop() a = operand_stack.pop() result = apply_operator(operator, b, a) operand_stack.push(result) # 返回最终的结果 return operand_stack.pop() # 测试算术表达式计算 expression = "3+4*2/(1-5)^2" result = evaluate(expression) print("计算结果:", result) ``` 这个算法首先定义了一个`Stack`类,用于实现栈数据结构。然后定义了一个`precedence`字典,用于存储每个运算符的优先级。接着定义了几个工具函数,包括`is_operator()`用于判断一个字符是否是运算符,`apply_operator()`用于计算两个操作数的结果,以及`evaluate()`用于计算算术表达式的值。 在`evaluate()`函数中,先初始化了操作数栈和运算符栈。然后遍历表达式中的每个字符,如果是数字则压入操作数栈,如果是左括号则压入运算符栈,如果是右括号则执行栈中的运算符直到遇到左括号,并将结果压入操作数栈,如果是运算符则执行栈中优先级更高或相等的运算符,并将结果压入操作数栈。执行栈中剩余的运算符,并返回最终的结果。 使用这个算法,可以计算包括括号、加减乘除和乘方运算的复杂算术表达式。在给定的示例中,计算结果为-3.0。 ######[AI写代码神器 | 2208点数解答 | 2024-10-22 23:01:03]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)278
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)495
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)222
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)449
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)440
- 用Python轻松将PPT每页转为图片,附代码示例!(阿里通义 | 315点数解答 | 2024-04-23 10:01:04)1389
- Python 实现:在 Windows 系统将 PPT 每页轻松转为图片(百度文心 | 692点数解答 | 2024-10-30 18:08:44)389
- Python 实现:轻松将 PPT 每页转换为图片(DeepSeek | 462点数解答 | 2025-02-17 17:26:45)287
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)420
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)443
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)550
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)416