Python 栈算法:优雅计算算术表达式
以下是一个使用 Python 实现的利用栈计算算术表达式的算法示例: ```python class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() else: return None def peek(self): if not self.is_empty(): return self.items[-1] else: return None def calculate_expression(expression): operand_stack = Stack() operator_stack = Stack() precedence = {'+': 1, '-': 1, '*': 2, '/': 2} for char in expression: if char.isdigit(): operand_stack.push(int(char)) elif char in '+-*/': while not operator_stack.is_empty() and precedence[operator_stack.peek()] >= precedence[char]: operand2 = operand_stack.pop() operand1 = operand_stack.pop() operator = operator_stack.pop() if operator == '+': operand_stack.push(operand1 + operand2) elif operator == '-': operand_stack.push(operand1 - operand2) elif operator == '*': operand_stack.push(operand1 * operand2) elif operator == '/': operand_stack.push(operand1 / operand2) operator_stack.push(char) while not operator_stack.is_empty(): operand2 = operand_stack.pop() operand1 = operand_stack.pop() operator = operator_stack.pop() if operator == '+': operand_stack.push(operand1 + operand2) elif operator == '-': operand_stack.push(operand1 - operand2) elif operator == '*': operand_stack.push(operand1 * operand2) elif operator == '/': operand_stack.push(operand1 / operand2) return operand_stack.pop() # 测试 expression = "2+3*4" result = calculate_expression(expression) print(result) ``` 这个算法的基本思路是: - 遍历表达式中的每个字符。 - 如果是数字,将其压入操作数栈。 - 如果是运算符,根据运算符的优先级进行处理。如果当前运算符的优先级低于或等于栈顶运算符的优先级,就先计算栈顶的运算,然后将结果压入操作数栈,再将当前运算符压入运算符栈。 - 遍历完表达式后,依次从运算符栈和操作数栈取出元素进行计算,直到运算符栈为空,最终操作数栈中的唯一元素就是计算结果。 ######[AI写代码神器 | 612点数解答 | 2024-10-22 23:05:28]
- 递归下降语法分析程序实例:从文法到 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 在 Windows 系统下编程实现 RSA 算法对照片加密与解密(字节豆包 | 373点数解答 | 2025-01-05 18:35:28)374
- Python 在 Windows 系统下编程实现 RSA 算法对照片加密与解密:附代码及注意事项(GPT | 1269点数解答 | 2025-01-05 18:37:09)259
- Python在Windows系统下实现RSA算法对手写签名照片加密解密,附代码及关键逻辑 (GPT | 786点数解答 | 2025-01-05 18:37:20)317
- 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