1.常规方法,用两个栈分别保存数字和符号

import reclass Solution:def calculator(self, expression):# 定义符号优先级prority = {"+": 1, "-": 1, "*": 2, "/": 2}# 使用数字栈和符号栈分别存放number_stack, operator_stack = [], []for each_str in expression:# 遍历到表达式的符号# 如果符号运算符为空或者当前符号的优先级不大于栈顶符号优先级,则入栈if each_str in prority.keys():if not operator_stack or prority[each_str] > prority[operator_stack[-1]]:operator_stack.append(each_str)# 否则,运算直至当前符号的优先级大于栈顶符号优先级或者符号栈为空# 当前符号入栈else:while operator_stack and prority[each_str] <= prority[operator_stack[-1]]:try:s1 = number_stack.pop()s2 = number_stack.pop()number_stack.append(int(eval("%s%s%s" % (s2, operator_stack[-1], s1))))except Exception:return False# 运算之后的运算符出栈operator_stack.pop()# 当前运算符入栈operator_stack.append(each_str)# 数字则直接入数字栈else:number_stack.append(each_str)# 遍历完成之后# 如果符号栈不为空,则继续运算直至为空print("After traverse : ")print("number_stack:", number_stack)print("operator_stack", operator_stack)if operator_stack:while operator_stack:try:s1 = number_stack.pop()s2 = number_stack.pop()number_stack.append(int(eval("%s%s%s" % (s2, operator_stack[-1], s1))))except Exception:return Falseoperator_stack.pop()if len(number_stack) == 1:return number_stack[0]else:return Falseif __name__ == '__main__':expression = str(input().strip())numbers = re.split("\+|-|\*|/", expression)operators = re.split("0|1|2|3|4|5|6|7|8|9", expression)operators = [x for x in operators if x]numbers = [int(x) for x in numbers if x]# 这一个判断是为了处理第一个数字是负数的情况,res默认第一个是数字if expression.strip()[0] == "-":numbers[0] = -int(numbers[0])del operators[0]res = []for i, _ in enumerate(expression):try:res.append(numbers[i])res.append(operators[i])except Exception:passprint(res)func = Solution()result = func.calculator(res)if result:print(result)else:print("Error")

输出结果为:

-3+34-45-8*4+80/2
[-3, '+', 34, '-', 45, '-', 8, '*', 4, '+', 80, '/', 2]
After traverse :
number_stack: [-46, 80, 2]
operator_stack ['+', '/']
-6

2.借助list.pop直接处理栈尾元素

只用一个栈,遇到运算符则进行如下处理:
+ 入栈
- 负值入栈
*/ 栈尾元素和当前数字运算之后入栈
最终得到一个栈,栈中元素之和即为表达式运算结果
def func():str_s = input().strip()each_num = 0bds = []# 第一个元素直接入栈flags = "+"for i, x in enumerate(str_s):if x.isdigit():each_num = int(x) if each_num == 0 else each_num * 10 + int(x)if x == "":passif x in "+-*/" or i == len(str_s) - 1:if flags == "+":bds.append(each_num)elif flags == "-":bds.append(-each_num)elif flags == "*":bds.append(bds.pop() * each_num)elif flags == "/":bds.append(bds.pop() // each_num)print(flags, each_num)flags = xeach_num = 0print(bds)print(sum(bds))if __name__ == '__main__':func()

运算结果为:

-3+34-45-8*4+80/2
+ 0
[0]
- 3
[0, -3]
+ 34
[0, -3, 34]
- 45
[0, -3, 34, -45]
- 8
[0, -3, 34, -45, -8]
* 4
[0, -3, 34, -45, -32]
+ 80
[0, -3, 34, -45, -32, 80]
/ 2
[0, -3, 34, -45, -32, 40]
-6

python栈--实现四则运算相关推荐

  1. C++的STL 栈 实现四则运算

    使用栈实现四则运算,支持+,-,*,/,(,) 输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出 这个实现借用了栈以及字符处理状态机的思想: 维护两个栈:一个用于数值,另一个用于存 ...

  2. python 栈实现

    python 栈实现 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Jun 26 2 ...

  3. 利用栈实现四则运算,带负数,带括号,带小数

    这利用栈实现四则运算,带负数,带括号,带小数,自己写的有问题大家纠正. #include <stdio.h> #include <stdlib.h> #include < ...

  4. python 栈实现_Python 栈(后进先出)

    Python 栈,栈是含有一组对象的容器,支持快速后进先出(LIFO)的插入和删除操作.与列表或数组不同,栈通常不允许随机访问所包含的对象.插入和删除操作通常称为入栈(push)和出栈(pop). 现 ...

  5. Python栈的实现

    Python栈的实现 1)使用list,列表尾部作栈顶 python的内置数据结构list可以用来实现栈,用append()向栈顶添加元素, pop() 可以以后进先出的顺序删除元素 但是列表本身有一 ...

  6. C语言程序:用栈实现四则运算

    用栈实现四则运算 第一部分 :LinkStack.h #ifndef LINKSTACK_H #define LINKSTACK_H#include <stdlib.h> #include ...

  7. 数据结构算法之通过栈实现四则运算

    栈是我目前学到的感觉最简单的一种数据结构,它就是一个有限制性的链表,进栈的一段我们称之为top,出栈的一头我们称之为栈顶base,如下图 它的基本结构形式是的一个栈顶指针,还有一个栈底指. typed ...

  8. python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算

    栈,是一种操作受限的线性表,其操作规则为:后进者先出,先进者后出. 目录 题目需求: 给定一个字符串,形如"1+6*5/3-8",根据其内容,计算结果,此例结果为3. 解题思路: ...

  9. python实现栈及栈在四则运算中的应用

    定义栈类: class Stack(object) :# 初始化栈为空列表def __init__(self):self.items = []# 判断栈是否为空,返回 True 或 Falsedef ...

最新文章

  1. 标准自编码器(TensorFlow实现)
  2. 跨进程通信,到底用长连接还是短连接
  3. 记一次使用快速幂与Miller-Rabin的大素数生成算法
  4. 模块修改-column_left.php
  5. 获取mongodb数据变更_支持mysql、MongoDB数据变更订阅/监听分发
  6. 【mysql】时间戳
  7. 阿里内推算法岗位编程笔试题
  8. java mrp模拟器_MRP模拟器(冒泡官方版)好用吗_MRP模拟器(冒泡官方版)怎么样_MRP模拟器(冒泡官方版)3.811用户评论-AppChina应用汇...
  9. KEPServerEX V6轻松连接Wonderware InTouch
  10. Html注释与Javascript注释的嵌套
  11. php mysql计数器代码一例
  12. 机器学习之理解支持向量机SVM
  13. 数据湖:数据同步工具NiFi
  14. 外贸网站到底选什么购物车网店系统最好
  15. vsphere学习笔记系列-vmotion
  16. html手机端下拉菜单代码,jQuery手机移动端下拉列表选择代码
  17. 怎么把学校计算机室的电脑连上网,笔记本电脑连不上校园网怎么办
  18. 邮件服务器怎么使用,Winmail Mail Server邮件服务器软件怎么使用
  19. canvas绘图夕颜技术笔记
  20. 知到网课影视鉴赏考试试题|真题题库(含答案)

热门文章

  1. HTML5的简单使用
  2. win10电脑硬盘出现黄三角感叹号的解决方法
  3. 网站服务器访问变慢是什么原因,网站访问速度太慢的一般解决方法
  4. 终止进程执行----杀死进程
  5. redis数据恢复流程及演示
  6. 安卓 (xml解析、高德地图)
  7. 恒指期货9月2日复盘记录及晚盘操作思路
  8. UE4\UE5触摸屏touch事件:单指、双指
  9. MFC小程序之画三角形并填充
  10. java按钮鼠标经过渐变_JavaScript实现的鼠标响应颜色渐变效果完整实例