学习以堆栈模式编写-计算器

堆栈特点:先进后出,

如下:

#!/opt/python3/bin/python3
# Author: yong
import re def is_symbol(element):
"""进行判断,是否为数字,如果匹配是运算符,返回True,否则返回false"""
res = False
symbol=['+','-','*','/','(',')']
if element in symbol:
res=True
return res def proitry(top_sym, wait_sym):
"""优先级比较"""
level1 = ['+','-']
level2 = ['*','/']
level3 = ['(']
level4 = [')']
# 运算符栈顶元素为:+或者-
if top_sym in level1:
if wait_sym in level2 or wait_sym in level3:
return '<'
else:
return '>'
# 以上是优化后的
# if wait_sym in level1:
# return '>'
# elif wait_sym in level2: # top_sym='-', wait_sym='*'
# return '<' # 无条件如占
# elif wait_sym in level3: # top_sym='-', wait_sym='('
# return '<'
# elif wait_sym in level4: # top_sym='-', wait_sym=')'
# return '>' # 进行运算
# else:
# return '>'
# 运算符栈顶元素为:*或者/
elif top_sym in level2:
if wait_sym in level3:
return '<'
else:
return '>'
# if wait_sym in level1: # top_sym='*' wait_sym='+'
# return '>'
# elif wait_sym in level2: # top_sym='*' wait_sym='*'
# return '>'
# elif wait_sym in level3: # top_sym='*' wait_sym='('
# return '<'
# elif wait_sym in level4: # top_sym='*' wait_sym=')'
# return '>'
# else:
# return '>'
# 运算符栈顶元素为:(
elif top_sym in level3:
if wait_sym in level4: # top_sym='(' wait_sym=')',右括弧遇到左括弧,左括弧弹出
return '='
else:
return '<' # 只要栈顶元素为(,等待入栈的元素都应该无条件入占 def calculate(num1, symbol, num2):
"""实现具体的运算"""
res = 0
if symbol == '+':
res = num1+num2
elif symbol == '-':
res = num1 - num2
elif symbol == '*':
res = num1 * num2
elif symbol == '/':
res = num1 / num2
# print('from calculate res is [%s|%s|%s] %s' % (num1, symbol, num2, res))
return res def init_action(expression):
"""运算字符串进行格式化,以列表返回数字和运算符,如:['-1', '+', '2', '-', '3']"""
expression = re.sub(' ', '',expression) # 去除空格
init_l = [i for i in re.split('(\-\d+\.*\d*)', expression) if i]
expression_l = []
while True:
if len(init_l) == 0:break
exp=init_l.pop(0)
if len(expression_l) == 0 and re.search('^\-\d+\.*\d*$', exp): # 匹配开头的负数
expression_l.append(exp)
continue
if len(expression_l) > 0: # 匹配运算字串中的负数
if re.search('[\+\-\*\/\(]$',expression_l[-1]):
expression_l.append(exp)
continue
new_l = [i for i in re.split('([\+\-\*\/\(\)])',exp) if i] # 对后续的字符串进行切分
expression_l += new_l
return expression_l def main(expression_1):
number_stack = [] # 数字栈
symbol_stack = [] # 运算符栈
for ele in expression_1: # 进行迭代
#####调试#####
print('-'*20)
print('数字栈',number_stack)
print('运算符栈',symbol_stack)
print('待入栈运算符',ele)
################
ret = is_symbol(ele)
if not ret:
# 压入数字栈
ele = float(ele)
number_stack.append(ele)
else:
# 压入运算符栈
while True:
if len(symbol_stack) == 0:
symbol_stack.append(ele)
break
res = proitry(symbol_stack[-1], ele)
if res == '<':
symbol_stack.append(ele)
break
elif res == '=':
symbol_stack.pop()
elif res == '>':
symbol = symbol_stack.pop()
num2 = number_stack.pop()
num1 = number_stack.pop()
number_stack.append(calculate(num1,symbol,num2))
else: # 循环执行完毕后,会剩最后一个运算,以下执行最后一次运算完成
symbol = symbol_stack.pop()
num2 = number_stack.pop()
num1 = number_stack.pop()
number_stack.append(calculate(num1, symbol, num2))
return number_stack,symbol_stack if __name__ == '__main__':
expression='1+2+3*4/6'
expression_1 = init_action(expression)
number_stack = main(expression_1)
print('运算最终结果:%s' % number_stack[0][0])

  

python练习之-计算器的更多相关文章

  1. python 编程之计算器

    作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...

  2. python作业day4计算器

    思路: 用循环提取最里面的括号,再进行运算 运算时利用正则表达式寻找相应的运算符 先进行乘除,再进行加减 (参考武sir和金角大王的代码) 流程图: 代码: #!/usr/bin/env python ...

  3. Python正则表达计算器

    Python学习笔记(十二): 计算器 利用Python的正则表达式写的简易计算器 # author : Ryoma # time : 17:39 import re def add(string): ...

  4. 如何用Python写一个计算器软件 附带效果图

    该计算器使用Python  tkinter模块开发 效果如下图 import tkinter #导入tkinter模块 root = tkinter.Tk() root.minsize(280,500 ...

  5. 利用Python代码编写计算器小程序

    import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...

  6. python作业模拟计算器开发(第五周)

    作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...

  7. [Python Study Notes]计算器

    # ------------------------------------------------------------------------------------- # @文件: 计算器.p ...

  8. 用python编写一个计算器

    # 1 - 2 * ((60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2)))# 通过Pyt ...

  9. 用Python开发实用程序 – 计算器

    一段时间前,自己制作了一个库 “sui-math”.这其实是math的翻版.做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于 ...

  10. Python版GPA计算器

    最近在网申投简历时遇到一个需要计算GPA的问题,想起自己在上学时写的Excel公式版GPA计算器略显low,而且操作也比较复杂,于是一时兴起,写了个Python版的,在此分享给大家,也算是跟上时代的浪 ...

随机推荐

  1. 精选30道Java笔试题附答案分析

    精选30道Java笔试题解答 都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑 ...

  2. 后台返回平铺数据,如何转换成树形json并渲染树形结构,ant tree 异步加载

    如何后台返回对象数组(平铺式) 1.根据字段标识(板块)获取根节点 ### initTreeData(dataOrg){ var resultArr=dataOrg[0] var secArr=[]; ...

  3. jQuery-AJAX简介

    AJAX是浏览器后台与服务器交换数据的技术,无须加载整个页面的情况下,对页面中的局部进行更新. AJAX=异步的JavaScript与XML(Asynchronous JavaScript and X ...

  4. javase(12)_集合框架_Queue

    一.Queue Queye接口体系图 体系分析: Deque实现类:ArrayDeque, LinkedList(数组和链表实现双向队列) BlockingDeque实现类:LinkedBlockin ...

  5. non-JRMP server at remote endpoint

    #在相应的domain的domain.xml文件添加下面红色设置,并重启domain <admin-service system-jmx-connector-name="system& ...

  6. CentOS7服务器上部署Oracle客户端

    环境 操作系统: CentOS7.2.1511 x86_64 准备安装包 在这个网站:https://www.oracle.com/technetwork/topics/linuxx86-64soft ...

  7. RN与现有的原生app集成

    https://facebook.github.io/react-native/docs/integration-with-existing-apps.html RN可以很好地支持往一个原生的app上 ...

  8. Day07 数据类型(列表,元组,字典,集合)常用操作和内置方法

    数据类型 列表list: 用途:记录多个值(同种属性) 定义方式:[]用逗号分隔开多个任意类型的值 list()造出来的是列表,参数是可迭代对像,也就是可以使用for循环的对像 传入字典,出来的列表元 ...

  9. hibernate 学习

    hibernate.cg.xml 可以通过myeclipse自动生成,添加数据库信息: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYP ...

  10. luogu3834 【模板】可持久化线段树 1(主席树)

    关于空间,第零棵树是 \(4n\),其后每棵树都要多来 \(\log(n)\) 的空间,所以我是开 \(n(4+\log(n))\) 的空间. 关于借用节点: 图片来自这里 #include < ...