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

堆栈特点:先进后出,

如下:

#!/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. Windows10系统可以禁止的服务(按名称排序)

    1.Application LayerGateway Service(Windows必须禁止的10项服务) 2.Bluetooth Handsfree Service(没有蓝牙的用户可以关闭) 3.B ...

  2. 开启和连接mysql服务器(win10为例)

    1.windows图标右键,选择“计算机管理”: 2.展开左边的“ 服务和应用程序” 选项,点击“服务",找到 MySQL 服务器,点击左侧的 "启动",即可完成 MyS ...

  3. (6)zabbix主机与组配置

    1. 创建主机方法 1.1 新建主机configuration(配置)->Hosts(主机)->Create host(创建主机) 见前面的博文 1.2 克隆/完全克隆主机 2. 主机参数 ...

  4. 如何用纯 CSS 创作一支诱人的冰棍

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrxzMw 可交互视频教 ...

  5. js常见面试题

    1.大小写转化,将字符串转化成驼峰的方法 例:border-bottom-color转化为:borderBottomColor var str="border-bottom-color&qu ...

  6. linux文件权限更改命令chmod及数字权限

    chmod -change file mode bits :更改文件权限 chmod是用来改变文件或者目录权限的命令,但只有文件的属主和超级用户(root)才有这种权限. 更改文件权限的2种方式: 一 ...

  7. js对象,数组,字符串的操作

    循环绑定=>变量污染 for (var i = 0;i<lis.length;i++){ lis[i].index = i;#给页面元素对象添加一个任意属性(保留索引的属性index) # ...

  8. Day16模块

    Day16 当做执行文件时 __name__ = "__main__" 当做模块被导入时 __name__ 等于文件名即模块名 ```python 循环导入(模块的名称空间已经建立 ...

  9. PyCharm学习笔记(一) 界面配置

     通过Ctrl+鼠标滚轮调整字体大小  设置代码区默认字体及大小 设置调试区的字体大小 设置代码风格:如Tab缩进 定义Python模板文件 # @Time : ${DATE} ${TIME} # @ ...

  10. 剑指Offer(书):反转链表

    题目:输入一个链表,反转链表后,输出新链表的表头. 分析:要分清他的前一个节点和后一个节点,开始的时候前节点为null,后节点为head.next,之后,反转. public ListNode Rev ...