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

堆栈特点:先进后出,

如下:

#!/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. MAC进入文件夹快捷键

    common + O common+up common+Down shift + common +G

  2. tomcat常用的优化和配置

    Tomcat 5常用优化和配置 1.JDK内存优化: Tomcat默认可以使用的内存为128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文 ...

  3. vue引用文件

    1)css引入在vue页面中<style scoped> @import url("../assets/css/home.css");</style>2)j ...

  4. 【译】Swift 字符串速查表

    [译]Swift 字符串速查表 2015-12-18 10:32 编辑: suiling 分类:Swift 来源:CocoaChina翻译活动 10 5585 Swift字符串 招聘信息: iOS高级 ...

  5. IE(IE6/IE7/IE8)支持HTML5标签--20150216

    让IE(ie6/ie7/ie8)支持HTML5元素,我们需要在HTML头部添加以下JavaScript,这是一个简单的document.createElement声明,利用条件注释针对IE来调用这个j ...

  6. Maven项目:@Override is not allowed when implement interface method

    今天新建一个maven项目实现接口方法的时候报错编译不通过@Override is not allowed when implement interface method,要配置pom文件的compi ...

  7. verilog behavioral modeling--overview

    1.verilog behavioral models contain procedural statements that control the simulation and manipulate ...

  8. 【转发】【linux】【php】centos 编译php常见错误

    configure: error: xml2-config not found. Please check your libxml2 installation. yum install libxml2 ...

  9. 菜鸟的《Linux程序设计》学习—shell script

    1. 认识shell script shell script是利用shell的功能缩写的一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面, ...

  10. TSOJ--2018 江苏省省赛

    [2018 江苏省大学生程序设计大赛] K. 2018 (测试数据范围有扩大) Problem Given a, b, c, d, find out the number of pairs of int ...