栈基本计算器 II:处理乘除优先级
在编程的世界里,算法和数据结构是解决问题的基石。LeetCode 是一个广受欢迎的在线编程平台,它提供了大量的编程题目,旨在帮助程序员提升算法和数据结构的能力。其中,“栈基本计算器 II”是一道经典的算法题,它要求我们实现一个计算器,能够处理包含加减乘除运算的字符串表达式,并正确处理乘除运算的优先级。
问题分析
题目要求我们实现一个计算器,能够计算一个包含数字、加号(+)、减号(-)、乘号()和除号(/)的字符串表达式的值。需要注意的是,乘号和除号具有高于加号和减号的优先级,这意味着在进行加法和减法运算之前,必须先完成乘法和除法运算。
解题思路
为了解决这个问题,我们可以使用两个栈:一个用于存储数字,另一个用于存储运算符。以下是解题的基本步骤:
1. 遍历输入的字符串表达式。
2. 遇到数字时,将其转换为整数并压入数字栈。
3. 遇到运算符时,根据运算符的类型和优先级进行处理:
- 如果当前运算符的优先级高于栈顶运算符的优先级,或者栈为空,则将当前运算符压入运算符栈。
- 否则,从数字栈中弹出两个数字,从运算符栈中弹出栈顶运算符,执行运算,并将结果压回数字栈。
4. 遍历完整个表达式后,如果运算符栈不为空,则继续执行步骤 3。
5. 数字栈中的栈顶元素即为表达式的结果。
代码实现
下面是使用 Python 实现的栈基本计算器 II 的代码:
python
class Solution:
def calculate(self, s: str) -> int:
def precedence(op: str) -> int:
if op in ('+', '-'):
return 1
if op in ('', '/'):
return 2
return 0
def apply_operator(a: int, b: int, op: str) -> int:
if op == '+':
return a + b
if op == '-':
return a - b
if op == '':
return a b
if op == '/':
return a // b
nums = []
ops = []
i = 0
while i < len(s):
if s[i].isdigit():
num = 0
while i < len(s) and s[i].isdigit():
num = num 10 + int(s[i])
i += 1
nums.append(num)
continue
if s[i] in '+-/':
while (ops and precedence(ops[-1]) >= precedence(s[i])):
nums.append(apply_operator(nums.pop(), nums.pop(), ops.pop()))
ops.append(s[i])
i += 1
while ops:
nums.append(apply_operator(nums.pop(), nums.pop(), ops.pop()))
return nums[-1]
总结
通过以上代码,我们实现了一个能够处理乘除优先级的计算器。这个计算器利用了栈的数据结构来存储数字和运算符,并通过比较运算符的优先级来决定何时执行运算。这种方法不仅能够处理乘除运算的优先级,还能够处理括号等更复杂的表达式。
在解决这类问题时,理解数据结构和算法的原理至关重要。通过不断地练习和思考,我们可以提高自己的编程能力,更好地应对各种算法挑战。
Comments NOTHING