python123外汇兑换计算器_python计算器

思路:

优先级处理

思路一:正则表达式+递归(计算时间慢)

思路二:堆栈的方式

队列:先进先出

电梯--》队列

上电梯(入队123):第三个人3,第二个人2,第一个人1

>>> li = []

>>> li.insert(0,'p1')#进队列

>>> li.insert(0,'p2')

>>> li.insert(0,'p3')

>>> li

['p3', 'p2', 'p1']

或者用append('元素')

下电梯(出队123):第一个人,第二个人,第三个人

>>> li.pop()#出队列

'p1'

>>> li.pop()

'p2'

>>> li.pop()

'p3'

>>>

如果用append方法,就用li.pop(0)

堆栈:先进后出

衣服箱子--》堆栈

装衣服(入栈123):第三件衣服3,第二件衣服2,第一件衣服1

>>> li = []

>>> li.insert(0,'a1')#进栈

>>> li.insert(0,'a2')

>>> li.insert(0,'a3')

>>> li

['a3', 'a2', 'a1']

>>>

取衣服(出栈321):第三件衣服,第二件衣服,第一件衣服

>>> li.pop(0)#出栈

'a3'

>>> li.pop(0)

'a2'

>>> li.pop(0)

'a1'

>>>

数字栈

运算符栈

拼接成表达式运算

实例:

#!/usr/bin/env python

#_*_coding:utf-8_*_

import re

#判断是数字还是符号的函数

def is_symbo(element):#遍历元素

res = False#判断运算符

symbol=['+','-','*','/','(',')']

if element in symbol:

res=True

return res

#exp优先级比较

def priority(top_sym,wait_sym):

#print('from the priotry:',top_sym,wait_sym)

level1=['+','-']

level2=['*','/']

level3 = ['(']

level4 = [')']

#运算符栈栈顶元素为+-

if top_sym in level1:

# 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 '>'

#优化

if wait_sym in level2 or wait_sym in level3:

return '

else:

return '>'

# 运算符栈栈顶元素为*/

elif top_sym in level2:

# if wait_sym in level1:#top_sym='*' wait_sym='+'

# return '>'

# if wait_sym in level2:#top_sym='*' wait_sym='*'

# return '>'

# elif top_sym in level3:#top_sym='-' wait_sym='('

# return '

# elif top_sym in level4:#top_sym='-' wait_sym=')'

# return '>'

# else:

# return '>'

#优化

if wait_sym in level3:

return '

else:

return '>'

#运算符栈顶元素为(

elif top_sym in level3:

if wait_sym in level4:#右括号)碰到了(,那么左括号应该弹出栈

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):

#print(expression)

#去掉空格,匹配空格,替换为空,目标是expression,重新赋值给expression

expression = re.sub(' ','',expression)

#print(expression)

init_l = [i for i in re.split('(\-\d+\.*\d*)',expression)if i]#提取-数字

#print('--->',init_l)

expression_l=[]#格式化列表,初始化为空

while True:

if len(init_l) ==0:break#pop完了结束

exp=init_l.pop(0)#列表左侧弹元素

#print('==>',exp)#打印列表每个元素

if len(expression_l) ==0 and re.search('^\-\d+\.*\d*$',exp):#-开头,数字结尾,匹配负数

expression_l.append(exp)

continue#直接进行下次循环,不分割-1

#判断负数出现的情况

if len(expression_l) > 0:

if re.search('[\+\-\*\/\(]$',expression_l[-1]):

expression_l.append(exp)

continue#不做切分,-2这步

new_l = [i for i in re.split('([\+\-\*\/\(\)])',exp) if i]#切分结果

#print(new_l)

expression_l+=new_l

#print(expression_l)

return expression_l

#主函数

def main(expression_l):

#print('from in the main',expression_l)

number_stack=[]#数字栈

symbol_stack=[]#运算符栈

for ele in expression_l:#遍历元素是数字还是运算符

print('-' * 20)

print('数字栈', number_stack)

print('运算符栈', symbol_stack)

print('待入栈运算符', ele)

ret = is_symbo(ele)

#print(ret)

if not ret:

#压入数字栈

ele=float(ele)

number_stack.append(ele)

else:

# 压入运算符栈

while True:

if len(symbol_stack) == 0:

symbol_stack.append(ele)

break

res=priority(symbol_stack[-1],ele)#优先级比较

if res == '

symbol_stack.append(ele)

break

elif res == '=':#右括号碰到左括号的情况

symbol_stack.pop()

break

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 *((-60+30+(-40/5)*(-9-2*-5/30-7/3*99/4*2998+10/-568/14))-(-4*-3)/(16-3*2))+3'

# expression='(1-2*3)-1-2*((-60+30+(-40/5)*(-9-2*-5/30-7/3*99/4*2998+10*568/14))-(-4*-3)/(16-3*2))+3'

#expression='-1 -3*( -2+3)'

#格式化处理,得到一个列表

expression_l = init_action(expression)#把用户输入的表达式格式化成一个列表的形式

#print(expression_l)

#分到数字栈,运算符栈

#主函数,处理格式化后的列表

jieguo=main(expression_l)#数字栈

print('最终结果是:%s' % jieguo[0][0])

结果:

--------------------

数字栈 []

运算符栈 []

待入栈运算符 -1

--------------------

数字栈 [-1.0]

运算符栈 []

待入栈运算符 -

--------------------

数字栈 [-1.0]

运算符栈 ['-']

待入栈运算符 2

--------------------

数字栈 [-1.0, 2.0]

运算符栈 ['-']

待入栈运算符 *

--------------------

数字栈 [-1.0, 2.0]

运算符栈 ['-', '*']

待入栈运算符 (

--------------------

数字栈 [-1.0, 2.0]

运算符栈 ['-', '*', '(']

待入栈运算符 (

--------------------

数字栈 [-1.0, 2.0]

运算符栈 ['-', '*', '(', '(']

待入栈运算符 -60

--------------------

数字栈 [-1.0, 2.0, -60.0]

运算符栈 ['-', '*', '(', '(']

待入栈运算符 +

--------------------

数字栈 [-1.0, 2.0, -60.0]

运算符栈 ['-', '*', '(', '(', '+']

待入栈运算符 30

--------------------

数字栈 [-1.0, 2.0, -60.0, 30.0]

运算符栈 ['-', '*', '(', '(', '+']

待入栈运算符 +

from calculate res is [-60.0|+|30.0] -30.0

--------------------

数字栈 [-1.0, 2.0, -30.0]

运算符栈 ['-', '*', '(', '(', '+']

待入栈运算符 (

--------------------

数字栈 [-1.0, 2.0, -30.0]

运算符栈 ['-', '*', '(', '(', '+', '(']

待入栈运算符 -40

--------------------

数字栈 [-1.0, 2.0, -30.0, -40.0]

运算符栈 ['-', '*', '(', '(', '+', '(']

待入栈运算符 /

--------------------

数字栈 [-1.0, 2.0, -30.0, -40.0]

运算符栈 ['-', '*', '(', '(', '+', '(', '/']

待入栈运算符 5

--------------------

数字栈 [-1.0, 2.0, -30.0, -40.0, 5.0]

运算符栈 ['-', '*', '(', '(', '+', '(', '/']

待入栈运算符 )

from calculate res is [-40.0|/|5.0] -8.0

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0]

运算符栈 ['-', '*', '(', '(', '+']

待入栈运算符 *

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0]

运算符栈 ['-', '*', '(', '(', '+', '*']

待入栈运算符 (

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(']

待入栈运算符 -9

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(']

待入栈运算符 -

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']

待入栈运算符 2

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, 2.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']

待入栈运算符 *

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, 2.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']

待入栈运算符 -5

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, 2.0, -5.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']

待入栈运算符 /

from calculate res is [2.0|*|-5.0] -10.0

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, -10.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']

待入栈运算符 30

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -9.0, -10.0, 30.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']

待入栈运算符 -

from calculate res is [-10.0|/|30.0] -0.3333333333333333

from calculate res is [-9.0|-|-0.3333333333333333] -8.666666666666666

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']

待入栈运算符 7

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 7.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-']

待入栈运算符 /

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 7.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']

待入栈运算符 3

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 7.0, 3.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']

待入栈运算符 *

from calculate res is [7.0|/|3.0] 2.3333333333333335

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 2.3333333333333335]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']

待入栈运算符 99

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 2.3333333333333335, 99.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']

待入栈运算符 /

from calculate res is [2.3333333333333335|*|99.0] 231.00000000000003

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 231.00000000000003]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']

待入栈运算符 4

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 231.00000000000003, 4.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '/']

待入栈运算符 *

from calculate res is [231.00000000000003|/|4.0] 57.75000000000001

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 57.75000000000001]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']

待入栈运算符 2998

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -8.666666666666666, 57.75000000000001, 2998.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '-', '*']

待入栈运算符 +

from calculate res is [57.75000000000001|*|2998.0] 173134.50000000003

from calculate res is [-8.666666666666666|-|173134.50000000003] -173143.1666666667

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+']

待入栈运算符 10

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, 10.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+']

待入栈运算符 /

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, 10.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']

待入栈运算符 -568

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, 10.0, -568.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']

待入栈运算符 /

from calculate res is [10.0|/|-568.0] -0.017605633802816902

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, -0.017605633802816902]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']

待入栈运算符 14

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.1666666667, -0.017605633802816902, 14.0]

运算符栈 ['-', '*', '(', '(', '+', '*', '(', '+', '/']

待入栈运算符 )

from calculate res is [-0.017605633802816902|/|14.0] -0.0012575452716297787

from calculate res is [-173143.1666666667|+|-0.0012575452716297787] -173143.16792421197

--------------------

数字栈 [-1.0, 2.0, -30.0, -8.0, -173143.16792421197]

运算符栈 ['-', '*', '(', '(', '+', '*']

待入栈运算符 )

from calculate res is [-8.0|*|-173143.16792421197] 1385145.3433936958

from calculate res is [-30.0|+|1385145.3433936958] 1385115.3433936958

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958]

运算符栈 ['-', '*', '(']

待入栈运算符 -

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958]

运算符栈 ['-', '*', '(', '-']

待入栈运算符 (

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958]

运算符栈 ['-', '*', '(', '-', '(']

待入栈运算符 -4

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, -4.0]

运算符栈 ['-', '*', '(', '-', '(']

待入栈运算符 *

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, -4.0]

运算符栈 ['-', '*', '(', '-', '(', '*']

待入栈运算符 -3

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, -4.0, -3.0]

运算符栈 ['-', '*', '(', '-', '(', '*']

待入栈运算符 )

from calculate res is [-4.0|*|-3.0] 12.0

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0]

运算符栈 ['-', '*', '(', '-']

待入栈运算符 /

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0]

运算符栈 ['-', '*', '(', '-', '/']

待入栈运算符 (

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0]

运算符栈 ['-', '*', '(', '-', '/', '(']

待入栈运算符 16

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0]

运算符栈 ['-', '*', '(', '-', '/', '(']

待入栈运算符 -

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0]

运算符栈 ['-', '*', '(', '-', '/', '(', '-']

待入栈运算符 3

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0, 3.0]

运算符栈 ['-', '*', '(', '-', '/', '(', '-']

待入栈运算符 *

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0, 3.0]

运算符栈 ['-', '*', '(', '-', '/', '(', '-', '*']

待入栈运算符 2

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 16.0, 3.0, 2.0]

运算符栈 ['-', '*', '(', '-', '/', '(', '-', '*']

待入栈运算符 )

from calculate res is [3.0|*|2.0] 6.0

from calculate res is [16.0|-|6.0] 10.0

--------------------

数字栈 [-1.0, 2.0, 1385115.3433936958, 12.0, 10.0]

运算符栈 ['-', '*', '(', '-', '/']

待入栈运算符 )

from calculate res is [12.0|/|10.0] 1.2

from calculate res is [1385115.3433936958|-|1.2] 1385114.1433936958

--------------------

数字栈 [-1.0, 2.0, 1385114.1433936958]

运算符栈 ['-', '*']

待入栈运算符 +

from calculate res is [2.0|*|1385114.1433936958] 2770228.2867873916

from calculate res is [-1.0|-|2770228.2867873916] -2770229.2867873916

--------------------

数字栈 [-2770229.2867873916]

运算符栈 ['+']

待入栈运算符 3

from calculate res is [-2770229.2867873916|+|3.0] -2770226.2867873916

最终结果是:-2770226.2867873916

python 计算器的(正则匹配+递归)

经过2天的长时间的战斗,python计算器终于完成了. import re val="1-2*((60-30*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3 ...

Python计算器实操

要求: 开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...

7_python之路之python计算器

7_python之路之python计算器 1.程序说明:Readme.cmd 1.程序文件及说明: calculator.py 2.python版本:python-3.5.3 3.程序使用:pytho ...

作业1开发一个简单的python计算器

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

老男孩python作业5-开发一个简单的python计算器

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

project1_calculator(使用tkinter实现python计算器,含有具体过程与注释)

最终的运行效果图(程序见序号7): #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------- ...

开发一个简单的python计算器

要求: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4* ...

初版python计算器

作业: 使用正则表达式实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 先看运行结果: 请输入您的计算式: 1 - 2 * ( (60-30 +(-40.0/5) * ...

使用re开发python计算器

#!/usr/bin/env python import reimport functools def minus_operator_handler(formula): '''处理一些特殊的减号运算' ...

随机推荐

Java 枚举类的基本使用

枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 1.常量的使用       在JDK1.5之前,我们定义常量都是:p ...

MySQL入门(三)

写了两篇以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧. 一 写SQL 其实我是不想 ...

socket+网路编程

1.网络编程: 通过某种计算机语言来实现不同设备间的资源共享和信息传递.计算机网络的创造可能比计算机本身意义更重大!!!(否则,你只能玩单机版游戏 OSI模型 OSI模型定义了不同计算机互联的标准,是 ...

关于Http协议(2)--转载

原文链接:http://www.cnblogs.com/mcad/ HTTP工作原理图 请求报文 1.请求报文长什么样?  Chrome核心的请求报文 2.报文结构 3.报文头部每个字段的意义 //从 ...

bat启动/停止oracle服务

原文:bat启动/停止oracle服务 自己的电脑比较慢,尤其装了oracle10g后,服务开启和关闭用bat文件操作省事点 开启服务 @echo offnet start OracleService ...

webuploader问题

pick里面的id,我理解就是有点选择器的意思,目前我的认知是不设置它就无法取文件操作: 然后,查看页面的时候发现,pick通过id选定的元素,被替换成了webuploader自定义的元素,表现是-- ...

java中关于log日志

博:http://zhw2527.iteye.com/blog/1006302 http://zhw2527.iteye.com/blog/1099658 在项目开发中,记录错误日志是一个很有必要功能 ...

Cocos Creator学习四:按钮响应事件

1.方法一:通过编辑器对cc.Button的属性进行拖放操作进行控制 (1)创建脚本BtnClick1.js,增加btnClick1函数,然后拖放到Canvas节点中(记得拖放,否则下面步骤将找不到对 ...

poj 3320(尺取法)

传送门:Problem 3320 参考资料: [1]:挑战程序设计竞赛 题意: 一本书有 P 页,每页都有个知识点a[i],知识点可能重复,求包含所有知识点的最少的页数. 题解: 相关说明: 设以a[ ...

在Ubuntu14.10中部署Hadoop2.6.0单节点伪分布集群

1. 环境信息如下: ubuntu:14.10 jdk:openjdk-1.7.0 hadoop:2.6.0 2. 下载hadoop2.6.0, http://apache.fayea.com/had ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值