【Leetcode刷题Python】224. 基本计算器
2023-09-14 09:12:58 时间
1 题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
提示:
1 <= s.length <= 3 * 105
s 由数字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 组成
s 表示一个有效的表达式
‘+’ 不能用作一元运算(例如, “+1” 和 “+(2 + 3)” 无效)
‘-’ 可以用作一元运算(即 “-1” 和 “-(2 + 3)” 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数
2 解析
代码里面:
res 表示左边表达式除去栈内保存元素的计算结果;
sign 表示运算符,在此代码中仅表示正负;
num 表示当前遇到的数字,会更新到 res 中;
用栈保存遇到左括号时前面计算好了的结果和运算符。
操作的步骤是:
-
如果当前是数字,那么更新计算当前数字;
-
如果当前是操作符+或者-,那么需要更新计算当前计算的结果 res,并把+ 当前数字 num 设为 0,sign 设为正负,重新开始;
-
如果当前是 ( ,那么说明遇到了右边的表达式,而后面的小括号里的内容需要优先计算,所以要把 res,sign 进栈,更新 res 和 sign 为新的开始;
-
如果当前是 ) ,那么说明右边的表达式结束,即当前括号里的内容已经计算完毕,所以要把之前的结果出栈,然后计算整个式子的结果;
-
最后,当所有数字结束的时候,需要把最后的一个 num 也更新到 res 中。
3 Python实现
class Solution:
def calculate(self, s: str) -> int:
num,res,sign = 0,0,1
stack = []
for c in s:
if c.isdigit():
# 两个个位数同时出现时,就是一个多位数的值
num = num*10+int(c)
elif c=='+'or c=='-':
res +=sign*num
num = 0
sign =1 if c=='+' else -1
elif c=='(':
# 数值进栈
stack.append(res)
# 符号进栈
stack.append(sign)
res = 0
sign = 1
elif c==')':
res +=sign*num
num = 0
# 符号出栈
sign_tmp = stack.pop()
# 数值出栈
res_tmp = stack.pop()
res *=sign_tmp
res += res_tmp
# 最后一步,别忘了
res += sign*num
return res
相关文章
- 地球科学领域Python工具合集
- python re.compile() 详解——Python正则表达式「建议收藏」
- 快过年了,用Python写副春联&福字送给你~
- python进制转换函数-Python中进制转换函数的使用
- python中dtype什么意思_NumPy Python中的数据类型对象(dtype)
- python中替换字符串中字符_Python replace()函数:替换字符串中的某个字符「建议收藏」
- python判断linux中文件是否存在_Python判断文件是否存在的三种方法
- Python开发命名规范
- python中关于命名的例子_Python 命名规范入门实例「建议收藏」
- Python编程 数值类型 布尔类型
- 【说站】python解包裹传递是什么
- 【说站】python字符串操作的整理
- 【说站】python中进程池Pool的初始化
- .h5文件的读取_python读写h5文件
- Python 反转字符串_python输出字符串
- Python 冒泡排序_python
- PYTHON主机_我的Python世界PDF
- 怎样安装pip_pip 安装本地python包
- 人生苦短,我用Python-手把手教你如何使用python写串口调试助手
- Python之ruamel.yaml模块详解(一)
- python文件操作(2017-8-5)详解编程语言
- 如何使用Python安装MySQL(python安装mysql)
- python使用Python轻松操作Redis(redis-)
- 用Python仿写MSSQL 编程体验更有趣(python仿mssql)