python 利用栈实现复杂计算器
#第五周的作业--多功能计算器
#1.实现加减乘除及括号的优先级的解析,不能使用eval功能,print(eval(equation))
#2.解析复杂的计算,与真实的计算器结果一致
#用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,
# 必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
''' 1.自左向右扫描表达式,凡是遇到操作数一律进操作数栈。
2.当遇到运算符时,如果它的优先级比运算符栈栈顶元素的优先级低就入栈。反之,取出栈顶运算符和操作数栈顶的两个连续操作数运算,并将结果存入操作数栈,然后继续比较该运算符与栈顶的运算符的优先级。
3.左括号一律进运算符栈,右括号一律不进运算符栈,取出栈顶运算符和操作数栈顶的两个连续操作数运算,并将结果存入操作数栈,直到取出左括号为止。


#给一个点,我们能够根据这个点知道一些内容
class Node(object):
def __init__(self,val): #定位的点的值和一个指向
self.val=val #指向元素的值
self.next=None #指向的指针
class Stack(object):
def __init__(self):
self.top=None #初始化最开始的位置
def peek(self): #获取栈顶的元素
if self.top!=None: #如果栈顶不为空
return self.top.val #返回栈顶元素的值
else:
return None
def push(self,n):#添加到栈中--入栈
n=Node(n) #实例化节点
n.next=self.top #顶端元素传值给一个指针
self.top=n #新入栈的节点作为栈顶元素
return n.val
def pop(self): #出栈
if self.top == None:
return None
else:
tmp=self.top.val
self.top=self.top.next #栈顶下移一位
return tmp # if __name__=="__main__":
# s=Stack()
# s.push(1)
# s.push(2)
# s.push(3)
#
# print(s.pop())
# print(s.pop())
# print(s.pop())
python 实现栈
下面是计算器的代码,引用了上面的栈的模块
#_*_coding:utf-8_*_
#第五周的作业--多功能计算器 import string
import re
from stack_test import Node,Stack
# 定义加法运算
def add(num1,num2):
return num1+num2
# 定义减法运算
def sub(num1,num2):
return num1-num2
# 定义乘法运算
def mult(num1,num2):
return num1*num2
# 定义除法运算
def div(num1,num2):
return num1/num2
# 定义运算的操作
operation={
"+":add,
"-":sub,
"*":mult,
"/":div
}
#判断一个字符串是否是数字
def is_number(s):
try:
float(s)
return True
except ValueError:
pass try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass return False # 定义运算符的优先级别
weight={
'(':3,
'*':2,
'/':2,
'+':1,
'-':1,
None:0
} # 进行运算
num1=0
num2=0
result=0#用于表示计算的
data_stack=Stack()#实例化的一个数栈,存放数
oper_stack=Stack()#实例化的一个符号栈,存放+-*/()
def deal_data():
p=oper_stack.pop()#把运算符出栈
num2=float(data_stack.pop())
num1=float(data_stack.pop())
result=operation[p](num1,num2)
print("%s %s %s临时结果:%s"%(num1,p,num2,result))
print("把计算的结果%s继续存入数栈中"%result)
data_stack.push(result)
return result while True:
equation=input("请输入计算的式子(*提示英文状态下):") # 对输入的算式字符串进行解析,eg:3*5,(99.8-52)*7+6-1.2*41
#1.2-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)) while equation:
cur=re.search(r'((^\d+\.?\d*)|(^\(\-\d+\.?\d*)|\(|\)|\+|\-|\*|/)',equation).group()
print("----->",cur)
if "(-" in cur:#考虑到负数的情形,如(-5.2)
# 一分为二,"("与"-4"
# 把左括号存入到符号栈中
bracket=cur[0]
print("----->",bracket)
print("将%s存入到符号栈中"%bracket)
oper_stack.push(bracket)
equation=equation[1:]
print("剩余的equation:",equation) # 把负数存入到符号栈中
num=cur[1:]
print("----->",num)
print("将%s存入到数栈中"%num)
data_stack.push(num)
equation=equation[len(num):]
print("剩余的equation:",equation)
else:#非负情形
lenth=len(cur)
if is_number(cur):#数字则存入数栈
print("将 %s 存入数栈data_stack"%cur)
data_stack.push(cur)
else:#非数字的符号
if cur=="(":#左括号一律入栈
print("将%s存入到符号栈中"%cur)
oper_stack.push(cur)
elif cur==")":#右括号则--将取两个数进行运算
deal_data()#处理数据的运算
#(12-5*8)再次判断“(”是否是符号栈的栈顶
while oper_stack.peek()!="(":
deal_data()
oper_stack.pop()#把左括号出栈 else:#运算符
if oper_stack.peek()==None:#符号栈为空
print("将%s存入到符号栈中"%cur)
oper_stack.push(cur)
else:#符号栈不为空 if weight[cur]>weight[oper_stack.peek()]:#当前符号优先级“高于”栈顶元素的优先级
print("将%s存入到符号栈中"%cur)
oper_stack.push(cur)
else:#当前符号优先级“等于|低于”符号栈栈顶元素的优先级
if oper_stack.peek()=="(":
print("将%s存入到符号栈中"%cur)
oper_stack.push(cur)
else:
deal_data()
while weight[cur]==weight[oper_stack.peek()]:
deal_data()
print("将%s存入到符号栈中"%cur)
oper_stack.push(cur) equation=equation[lenth:]
print("剩余的equation:",equation)
# 把算式逐个拆解完了,最后处理栈中还剩余的数据
result=deal_data()
while oper_stack.peek()!=None:
result=deal_data() print("计算的结果为:\033[31;1m%s\033[0m"%result)
python利用栈实现复杂计算器
python 利用栈实现复杂计算器的更多相关文章
- python 利用正则构建一个计算器
该计算器主要分为四个模块: weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式: add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值 ...
- python 全栈开发之路 day1
python 全栈开发之路 day1 本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...
- 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】
点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Python全栈开发【基础一】
Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...
- Python全栈考试-部分试题(精选)
Python全栈考试(一) Python全栈考试(一) 1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py ...
- Python全栈之路目录结构
基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...
- 【DataStructure In Python】Python模拟栈和队列
用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...
随机推荐
- Log4j 2.0读取配置文件的方法
log4j中配置日志文件存放的位置不一定在src下面,即根目录下.这个时候我们需要解决如何加载配置文件的问题.在log4j1.x中解决的方法就比较多了.如:PropertyConfigurator.c ...
- 鹅厂优文|主播pk,如何实现无缝切换?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者,rexchang(常青),腾讯视频云终端技术总监,2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手 ...
- PostgreSQL PARTITION 分区表
PostgreSQL 分区表,操作性相当便捷. 但只能在创建时决定是否为分区表,并决定分区条件字段,普通表创建后,不能在修改为分区表. Note:通过其他方法也可转化为分区表. 和其他数据库一样,分区 ...
- Centos7 redis 5.0 服务设置、启动、停止、开机启动
redis 没有配置服务,没有开启动,每次都要手工配置. 解决这个麻烦,我们new一个服务,然后开机启动即可. 1.创建服务(redis.conf 配置文件要注意,经过cp产生了很多个redis.co ...
- mac 好用软件地址存储
Navicat Premium 12.0.24 for mac已破解中文 https://www.52pojie.cn/thread-727433-1-1.html sublime 破解方法https ...
- sun.misc.unsafe
Java中大部分错误都是基于内存管理方面的.如果想破坏,可以使用Unsafe这个类. 实例化Unsafe: 下面两种方式是不行的 private Unsafe() {} //私有构造方法 @Calle ...
- JAVA SwingWorkder的使用例
最近在学习Swing,我们都知道在UI表现线程里面长时间执行操作时,画面会假死,为了能够让费时操作不影响画面表现,就需要用多线程了.首先考虑的就是Swing内部的 SwingWorkder对象,但是网 ...
- sql: Compare Tables
---使用 UNION.INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式 select * from BookInfoList --存在不同的 selec ...
- 禁用F12和鼠标右键,防止查看控制台代码
虽然是个治标不治本的办法,还是挺有用的(对Opera无效,Opera开始控制台是Ctrl+Shift+C) 在禁用同时,自身的代码健壮性也需要加强 // 屏蔽F12 document.onkeydow ...
- react+antd 选项卡切换
index.js: import React from 'react'; import ReactDOM from 'react-dom'; import CardSecond from './Car ...