python栈--实现四则运算
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栈--实现四则运算相关推荐
- C++的STL 栈 实现四则运算
使用栈实现四则运算,支持+,-,*,/,(,) 输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出 这个实现借用了栈以及字符处理状态机的思想: 维护两个栈:一个用于数值,另一个用于存 ...
- python 栈实现
python 栈实现 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Jun 26 2 ...
- 利用栈实现四则运算,带负数,带括号,带小数
这利用栈实现四则运算,带负数,带括号,带小数,自己写的有问题大家纠正. #include <stdio.h> #include <stdlib.h> #include < ...
- python 栈实现_Python 栈(后进先出)
Python 栈,栈是含有一组对象的容器,支持快速后进先出(LIFO)的插入和删除操作.与列表或数组不同,栈通常不允许随机访问所包含的对象.插入和删除操作通常称为入栈(push)和出栈(pop). 现 ...
- Python栈的实现
Python栈的实现 1)使用list,列表尾部作栈顶 python的内置数据结构list可以用来实现栈,用append()向栈顶添加元素, pop() 可以以后进先出的顺序删除元素 但是列表本身有一 ...
- C语言程序:用栈实现四则运算
用栈实现四则运算 第一部分 :LinkStack.h #ifndef LINKSTACK_H #define LINKSTACK_H#include <stdlib.h> #include ...
- 数据结构算法之通过栈实现四则运算
栈是我目前学到的感觉最简单的一种数据结构,它就是一个有限制性的链表,进栈的一段我们称之为top,出栈的一头我们称之为栈顶base,如下图 它的基本结构形式是的一个栈顶指针,还有一个栈底指. typed ...
- python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算
栈,是一种操作受限的线性表,其操作规则为:后进者先出,先进者后出. 目录 题目需求: 给定一个字符串,形如"1+6*5/3-8",根据其内容,计算结果,此例结果为3. 解题思路: ...
- python实现栈及栈在四则运算中的应用
定义栈类: class Stack(object) :# 初始化栈为空列表def __init__(self):self.items = []# 判断栈是否为空,返回 True 或 Falsedef ...
最新文章
- 标准自编码器(TensorFlow实现)
- 跨进程通信,到底用长连接还是短连接
- 记一次使用快速幂与Miller-Rabin的大素数生成算法
- 模块修改-column_left.php
- 获取mongodb数据变更_支持mysql、MongoDB数据变更订阅/监听分发
- 【mysql】时间戳
- 阿里内推算法岗位编程笔试题
- java mrp模拟器_MRP模拟器(冒泡官方版)好用吗_MRP模拟器(冒泡官方版)怎么样_MRP模拟器(冒泡官方版)3.811用户评论-AppChina应用汇...
- KEPServerEX V6轻松连接Wonderware InTouch
- Html注释与Javascript注释的嵌套
- php mysql计数器代码一例
- 机器学习之理解支持向量机SVM
- 数据湖:数据同步工具NiFi
- 外贸网站到底选什么购物车网店系统最好
- vsphere学习笔记系列-vmotion
- html手机端下拉菜单代码,jQuery手机移动端下拉列表选择代码
- 怎么把学校计算机室的电脑连上网,笔记本电脑连不上校园网怎么办
- 邮件服务器怎么使用,Winmail Mail Server邮件服务器软件怎么使用
- canvas绘图夕颜技术笔记
- 知到网课影视鉴赏考试试题|真题题库(含答案)