给定一个字符串str,str 表示一个公式,公式里可能有整数,加减乘除,返回公式的计算结果。

【举例】

str = “3-6*9+43*70*8-6” , 返回 24023

str = “3+1*4” , 返回 7

分析:

由于乘除的计算优先级高于加减,因此:第一遍遍历优先计算乘除,第二遍遍历再计算加减。

def expression_compute(string):stack = []i = 0while i < len(string):item = string[i]# 遇到数字if '0' <= item <= '9':num, j = get_num(string, i)stack.append(num)i = j# 遇到乘除:立即计算elif item == "*" or item == "/":num, j = get_num(string, i + 1)stack.append(compute(stack.pop(), item, num))i = j# 遇到加减:暂时缓存elif item == "+" or item == "-":stack.append(item)i += 1# 计算加减i = 0res = stack[0]# 注意从前向后计算while i < len(stack) - 1:operator = stack[i + 1]num2 = stack[i + 2]res = compute(res, operator, num2)i += 2return res# 从 string 的 index 位置开始获取数字
# 返回:num, i。计算结果,后续要处理的位置
def get_num(string, index):num = 0for i in range(index, len(string)):item = string[i]if item < '0' or item > '9': breaknum = num * 10 + int(item)return num, i + 1 if i == len(string) - 1 else i# 运算
def compute(num1, operator, num2):if operator == "+": return num1 + num2if operator == "-": return num1 - num2if operator == "*": return num1 * num2if operator == "/": return int(num1 / num2)print(expression_compute("14-95+62/50"))

给定一个字符串str,str 表示一个公式,公式里可能有整数,加减乘除和左右括号,返回公式的计算结果。

【举例】

str = “48*((70-65)-43)+8*1” , 返回 -1816

str = “3+1*4” , 返回 7

str = “3+(1*4)” , 返回 7

【说明】

  1. 可以认为给定的字符串一定是正确的公式,即不需要对 str 做公式有效性检查。
  2. 如果是负数,就需要用括号括起来,比如”4*(-3)“ 。但如果负数作为公式的开头或者括号部分的开头,则可以没有括号,比如:”-3*4“ 和 ”(-3*4)“ 都是合法的。
  3. 不用考虑计算过程中发生的溢出的情况

运算规则:

  • 优先计算括号内公式
  • 再计算乘算
  • 再计算加法

在计算括号内公式时:遇到 ”(“ 时,递归调用,再遇到 “)” 在进行计算,每次调用 que 中只存储当前括号内的公式。

def expression_compute(string):return process(string, 0)[0]def get_num(string, index):num = 0for i in range(index, len(string)):item = string[i]if item < '0' or item > '9': breaknum = num * 10 + int(item)return num, i + 1 if i == len(string) - 1 else i# 计算 string 公式
# 优先括号内的公式,再计算乘除,再计算加减
def process(string, index):que = []i = indexwhile i < len(string):# (:递归调用if string[i] == "(":num, j = process(string, i + 1)i = jque.append(num)# 遇到数字elif "0" <= string[i] <= "9":num, j = get_num(string, i)que.append(num)i = j# ) 计算括号内的公式elif string[i] == ")":res = sub_expression_compute(que)return res, i + 1else:que.append(string[i])i += 1# 计算没有括号,剩下的公式return sub_expression_compute(que), i# 计算 array 内的公式
# 优先计算乘除,再计算加减
def sub_expression_compute(array):stack = []i = 0# 计算乘除while i < len(array):if array[i] == "*" or array[i] == "/":stack.append(compute(stack.pop(), array[i], array[i + 1]))i += 2else:stack.append(array[i])i += 1# 计算加减i = 0res = stack[0]while i < len(stack) - 1:operator = stack[i + 1]num2 = stack[i + 2]res = compute(res, operator, num2)i += 2return res# 运算
def compute(num1, operator, num2):if operator == "+": return num1 + num2if operator == "-": return num1 - num2if operator == "*": return num1 * num2if operator == "/": return int(num1 / num2)print(expression_compute("48*((70-65)-43)+8*1"))
print(expression_compute("3+1*4"))
print(expression_compute("3+(1*4)"))

【每日一题】公式计算相关推荐

  1. 【每日一题】美国节日(基姆拉尔森公式、蔡勒公式)

    [每日一题]美国节日(基姆拉尔森公式.蔡勒公式)   相关文章:   [每日一题]一周中的第几天(基姆拉尔森公式的应用)   [每日一题]美国节日(基姆拉尔森公式.蔡勒公式)   [每日一题]计算日期 ...

  2. 【每日一题】快速检索

    [每日一题]快速检索 1.笔试-选择题   [笔试-选择题] 2.有关字符串   [每日一题]删除公共字符   [每日一题]字符串筛选-去除所有相同的字符   [每日一题]倒置字符串-巧用cin输入流 ...

  3. [每日一题] 62. 美国节日(日期计算、蔡勒公式)

    1. 题目来源 链接:美国节日 来源:牛客网 2. 题目说明 和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同.具体规则如下: 1月1日:元旦 1月的 ...

  4. 电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场

    电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场 无限长均匀电流 无限长圆柱面均匀电流密度 无限长均匀电流 假设z轴上有一根非常细的电线,携带均匀电流I0I_0I ...

  5. 电动力学每日一题 2021/10/13 用Fourier变换法计算静止电荷产生的电场

    电动力学每日一题 2021/10/13 用Fourier变换法计算静止电荷产生的电场 静止点电荷 具有均匀线密度的静止电荷产生的电场 具有均匀面密度的静止电荷产生的电场 用Fourier变换法计算电场 ...

  6. 计算机网络的最短帧长公式,每日一题 | CSMA/CD协议的最短帧长公式

    原标题:每日一题 | CSMA/CD协议的最短帧长公式 苏世计算机考研,程序猿专属的学习分享社区 苏世小课堂,每日一题! 为了帮助大家及时回顾所学知识,特开设本"每日一题"专栏,从 ...

  7. Java黑皮书课后题第4章:4.4(几何:六边形面积)六边形面积可以通过下面公式计算(s是边长) 编写程序,提示用户输入六边形的边长,然后显示它的面积

    4.4(几何:六边形面积)六边形面积可以通过下面公式计算(s是边长) 编写程序,提示用户输入六边形的边长,然后显示它的面积 题目 题目概述 运行示例 破题 代码 题目 题目概述 4.4(几何:六边形面 ...

  8. Java黑皮书课后题第6章:6.35(几何:五边形的面积)五边形的面积可以用如下公式计算。编写一个方法,使用下面的方法头返回五边形面积。编写一个主方法,提示用户输入五边形的边,然后显示它的面积

    6.35(几何:五边形的面积)五边形的面积可以用如下公式计算.编写一个方法,使用下面的方法头返回五边形面积.编写一个主方法,提示用户输入五边形的边,然后显示它的面积 题目 题目描述与运行示例 破题 代 ...

  9. 信息项目管理师计算机公式,(最新整理)信息系统项目管理师九个公式计算题

    <(最新整理)信息系统项目管理师九个公式计算题>由会员分享,可在线阅读,更多相关<(最新整理)信息系统项目管理师九个公式计算题(7页珍藏版)>请在人人文库网上搜索. 1.完整) ...

  10. SQL每日一题(20210824)假设计算日期是从2021-7-13开始计算,PENDING_DAYS表示到货还需要的天数

    SQL每日一题(20211215) SQL每日一题(20220510) select a.item, a.qty, case when a.qty<=b.qty then '在途' else ' ...

最新文章

  1. 钻井缸套排量_川庆钻探||合理化建议成果展示:用陶瓷代替金属,缸套使用寿命延长了10倍...
  2. 产品策略研究期的数据分析与挖掘
  3. apt-get无法下载,一些网址Not Found 404
  4. 当面试官要求现场手敲代码,该如何体现你对Python的编程能力?
  5. 爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常
  6. python正则匹配找到所有的浮点数_Python随笔17:Python正则表达式基础(4):贪婪匹配和最小匹配...
  7. 学成在线首页——静态页面(html+css)素材链接放在文章结尾了
  8. Java项目:校园自行车租赁管理系统(java+JSP+JavaScript+Servlet+Mysql)
  9. 历年软件设计师下午考试试题汇总统计
  10. (转载) Android RecyclerView 使用完全解析 体验艺术般的控件
  11. jQuery插件之jqzoom放大镜插件
  12. 关于Android开发者的简历
  13. express比php好用,[译]Node.js 框架比较: Express vs. Koa vs. Hapi
  14. U-Net深度学习灰度图像的彩色化
  15. cdrom是什么意思_电脑按f8一键出现cdrom:ps-ASUS DVD-e818a4是什么意思
  16. 基于spring boot的毕业设计论文选题申报管理系统设计与实现 毕业论文+项目源码、
  17. golang 下载图片
  18. 有趣好玩实用的网站 保证闻所未闻
  19. XAMPP/PHPnow/phpStudy安装使用对比
  20. Java基于springboot+vue的房屋出租租房系统 前后端分离

热门文章

  1. i7 7700hq安装Linux,酷睿i7-7700HQ尚能饭否?新老游戏本平台实测对比
  2. html怎么拼贴背景图,如何将多张图片拼贴在一起 制作精美的拼贴图|可随意排版制作层叠效果...
  3. WIN7定时开关机命令
  4. 富士康生产一部iPhone6赚多少?25元人民币
  5. SDUT 简单枚举类型——植物与颜色
  6. 华为荣耀20和x10比较_华为畅享20Pro和荣耀X10哪个好 看完区别对比后就懂了
  7. HTML可以让元素透过元素点击,通过Mootools 1.2来操纵HTML DOM元素
  8. Smart work——以sketch导出标注为例
  9. android spinner文字居中,让Spinner中的文字居中
  10. 沿曲线运动的彗星拖尾效果实现Demo(JavaScript)