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

堆栈特点:先进后出,

如下:

#!/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. Open Scene Graph:让VS支持不含后缀的头文件

    让VS支持不含后缀的头文件 看OSG源码时,会遇到不含后缀的头文件无定位信息的尴尬,很让人苦恼. 就是单击VS中“工具菜单栏”——>”选项(O)….”如下图所示: 菜单项,弹出选项对话框,单击“ ...

  2. MYSQL 注射精华

    前言鄙人今天心血来潮突然想写篇文章,鄙人从来没写过文章,如果有错误的地方请多多指教.本文需要有基础的SQL语句知识才可以更好的理解.建议想学习的人多去了解一下SQL语句和编程语言,知己知彼才能百战百胜 ...

  3. Bootstrap 基本按钮

    本章将通过实例讲解如何使用Bootstrap按钮,任何带有class.btn的元素都会继承圆角灰色默认按钮样式,但Bootstrap提供了一些选项来定义按钮的样式. 实例 <!DOCTYPE h ...

  4. shell脚本,如何监控mysql数据库。

    [root@localhost wyb]# cat jkmysql #!/bin/bash status=`/etc/init.d/mysqld status|grep running|wc -l` ...

  5. 常用JavaScript正则表达式整理

    在表单验证中,正则表达式书写起来特别繁琐,本文整理了15个常用的JavaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IP ...

  6. hihoCoder-1109-堆优化的Prim

    优先队列是由堆组成的,所以当我们使用优先队列对Prim进行优化时,就把这种优化叫做堆优化. 它的算法核心思想就是每次向后找边,每个pair存的都是下一个点,以及边权.我们对于已经走过的点就避开,这样就 ...

  7. [LUOGU] P4767 [IOI2000]邮局

    https://www.luogu.org/problemnew/show/P4767 四边形不等式好题! 可以设f[i][j]表示前i个村庄,建了j个邮局的最小代价. 转移:f[i][j]=min{ ...

  8. atlas 日志分析脚本

    #!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油! #@file: log_analyze.py #@time: 2018/8/23 17: ...

  9. linux各种终端类型的区别和概念

    1 pty(虚拟终端或伪终端): 当我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty). 2 tty(终端设备的统称):tty一词源 ...

  10. 在/etc/crondtab中添加定时任务注意事项

    1 要添加用户名 2 要重启定时任务服务