
calculate-基本计算题
初始化栈:使用一个列表来模拟栈,用于存储字符和运算结果。 遍历字符串:逐个处理每个字符: 计算括号内的值:当遇到右括号时,找到对应的左括号,计算括号内的表达式,将结果替换原括号及其内容。 处理栈中的运算:最终栈中可能包含运算符和数字,按顺序计算结果。
发布日期:2021-05-18 07:53:19
浏览次数:29
分类:精选文章
本文共 2140 字,大约阅读时间需要 7 分钟。
为了实现一个能够处理括号和运算符号的计算器,我们可以使用栈来模拟括号的处理过程。栈可以帮助我们处理嵌套的括号,并在遇到右括号时计算括号内的表达式。以下是详细的步骤和代码实现:
解题思路
- 遇到左括号
(
,将其压入栈。 - 遇到右括号
)
,找到对应的左括号,计算括号内的表达式,将结果压入栈,并将括号及其内容替换为结果。 - 遇到运算符
+
或-
,将其压入栈。 - 遇到数字,直接压入栈。
- 忽略空格
。
代码实现
def calculate(s): stack = [] for char in s: if char == '(': stack.append(char) elif char == ')': # 找到对应的左括号 start = stack.index('(') # 计算括号内的值 value = sum_count(stack, start + 1) # 替换括号及其内容为计算结果 stack[start] = str(value) stack.pop() # 移除右括号 elif char in '+-': stack.append(char) elif char == ' ': continue else: # 处理数字 stack.append(char) # 处理栈中的运算 if not stack: return 0 # 去掉可能的空格 stack = [c for c in stack if c != ' '] result = 0 sign = 1 i = 0 while i < len(stack): c = stack[i] if c == '+': sign = 1 i += 1 elif c == '-': sign = -1 i += 1 elif c.isdigit(): num = int(c) result += sign * num sign = 1 i += 1 return resultdef sum_count(stack, index): # 计算从index开始的括号内的值 sum_val = 0 sign = 1 i = index while i < len(stack): c = stack[i] if c == '+': sign = 1 i += 1 elif c == '-': sign = -1 i += 1 elif c == '(': # 处理嵌套的情况,继续寻找括号 i += 1 # 递归处理括号内的内容 val = sum_count(stack, i) sum_val += sign * val sign = 1 i += 1 elif c == ')': # 计算括号内的值并返回 return sum_val else: # 处理数字 num = int(c) sum_val += sign * num sign = 1 i += 1 return sum_val
代码解释
calculate函数:
- 初始化栈
stack
。 - 遍历字符串中的每个字符,处理括号、运算符和数字。
- 当遇到右括号时,计算括号内的值并替换括号及其内容。
- 最后计算栈中的运算结果。
sum_count函数:
- 从指定的索引开始计算括号内的值。
- 处理运算符
+
和-
,以及嵌套的括号。 - 返回括号内计算得到的值。
这种方法确保了括号内的表达式优先计算,处理了嵌套的情况,并正确处理了运算符和数字的顺序。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月28日 15时34分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vue 权限管理 菜单按钮权限控制(7)
2019-03-17
vue 权限管理 主题切换(8)
2019-03-17
springboot 文件上传下载(简洁明了)
2019-03-17
spring
2019-03-17
inno setup 一些技巧
2019-03-17
Qt 在Excel文件中Chart绘图
2019-03-17
TCP 详解
2019-03-17
U3D时间
2019-03-17
U3D资源加载
2019-03-17
音频优化(简短版本)
2019-03-17
01-webpack5理解及配置
2019-03-17
JavaScript作用域和作用域链
2019-03-17
STM32F103 实例应用(6)——通信概念
2019-03-17
洛谷 P1020 导弹拦截 (LIS)
2019-03-17
idea webstorm破解 激活
2019-03-17
Linux基础命令(一)
2019-03-17
推荐学习Python的网站
2019-03-17