主页 > imtoken下载链接 > Python四算计算器总结_Python实现一个简单的四算计算器

Python四算计算器总结_Python实现一个简单的四算计算器

imtoken下载链接 2023-05-09 06:49:23

摘要: 1.算法1.算法的主要思想是将一个中缀表达式(Infix expression)转化为一个易于处理的后缀表达式(Postfix expression),然后利用栈的简单数据结构来进行计算表达式结果。 2. 普通表达式如何转换为后缀表达式,以及如何处理后缀表达式并计算结果的具体算法说明不在这里

1.算法

1.算法的主要思想是将一个中缀表达式(Infix expression)转换成一个易于处理的后缀表达式(Postfix expression)etc计算器,然后借助简单的数据结构计算表达式的结果的堆栈。

2、关于如何将普通表达式转化为后缀表达式,以及如何处理后缀表达式并计算结果的具体算法说明,这里不再赘述。 书中有详细的说明。

2.简单的计算器

使用说明

下面是一个使用计算器类的简单示例:#usage

c = 计算器()

print('结果:{:f}'.formart(c.get_result('1.11+2.22-3.33*4.44/5.55')))

#输出:

结果:0.666000

测试用例

为了有效测试本计算器etc计算器,设计了多组测试用例,测试结果如下: TestNo.1: (1.11)=1.110000

测试二:1.11+2.22-3.33*4.44/5.55=0.666000

测试三:1.11+(2.22-3.33)*4.44/5.55=0.222000

测试4号:1.11+(2.22-3.33)*(4.44+5.55)/6.66=-0.555000

测试5号:1.11*((2.22-3.33)*(4.44+5.55))/(6.66+7.77)=-0.852992

测试六:(1.11+2.22)*(3.33+4.44)/5.55*6.66=31.048920

7号测试:(1.11-2.22)/(3.33+4.44)/5.55*(6.66+7.77)/(8.88)=-0.041828

TestNo.8: Error: (1.11+2.22)*(3.33+4.44: missing")", 请检查你的表达

测试 No.9:错误:(1.11+2.22)*3.33/0+(34-45):除数不能为零

测试 No.10:错误:12+89^7:无效字符:^

实现代码

栈的实现

栈其实就是一个操作受限的表。 所有操作只能在栈顶进行(入栈、出栈等)。 下面是一个使用Python代码实现的简单栈:classStack(object):

"""

堆栈的结构。

用户不必知道定义。

"""

def__init__(自我):

self.__container=list()

def__is_empty(自我):

"""

证明堆栈是否为空

:返回:真或假

"""

returnlen(self.__container)==0

defpush(自我,元素):

"""

向堆栈中添加一个新元素

计算北京地铁票价器_有没有etc收费器_etc计算器

:paramelement:theelementyouwanttoadd

:返回:无

"""

self.__container.append(元素)

deftop(自我):

"""

获取栈顶元素

:return:top元素

"""

ifself.__is_empty():

返回无

返回 self.__container[-1]

defpop(自我):

"""

移除栈顶元素

:return:None 或栈顶元素

"""

返回 None 如果 self.__is_empty() 否则 self.__container.pop()

清除(自我):

"""

我们将创建一个空堆栈

:回报:自我

"""

self.__container.clear()

返回你自己

计算器类的实现

在计算器类中,我们将表达式的合法性校验放在一个单独的函数中,但其实如果需要的话,也可以直接在中缀表达式转后缀表达式的函数中实现,这样只需要be done once 验证和转换可以通过遍历表达式同时进行。 但是为了保持结构清晰,还是分开实现比较好。 把每个功能都做到最好才是比较实用的。

在计算器类中,有很多没有考虑的corner case,因为那样的话整个实现代码会比较多。 不过后期可以继续扩展整个类,也可以增加新的功能。 目前实现的是主要框架,包括基本的错误检测和计算。 重点是要学会使用栈这种看似简单但功能强大的数据结构来解决问题。 类计算器(对象):

"""

一个简单的计算器,只是为了好玩

"""

def__init__(自我):

self.__exp=''

def__validate(自我):

"""

我们必须确保表达式是合法的。

1. 我们只接受 `()` 来指定子表达式的优先级。 注意:`[{`and`]}` 将是

分别替换为`(`and`)`。

etc计算器_计算北京地铁票价器_有没有etc收费器

2. 有效字符应该是`+`,`-`,`*`,`/`,`(`,`)`和数字(int,float)

-无效的表达式示例,但我们只能处理第 4 种情况。 实施将

如果我们想处理所有可能的情况,则要复杂得多。:

1.`a+b-+c`

2.`a+b+-`

3.`a+(b+c`

4.`a+(+b-)`

5.等

:返回:真或假

"""

ifnotisinstance(self.__exp, str):

print('Error: {}: expression should beastring'.format(self.__exp))

返回假

#Savethenon-spaceexpression

val_exp=''

s=堆栈()

forxinself.__exp:

#Weshouldignorethespace字符

ifx=='':

继续

ifself.__is_bracket(x)orself.__is_digit(x)orself.__is_operators(x)\

orx=='.':

ifx=='(':

s.push(x)

elifx==')':

秒。 流行音乐()

val_exp+=x

别的:

打印('错误:{}:无效字符:{}'.format(self.__exp,x))

返回假

ifs.top():

print('Error:{}:missing")", 请检查你的表达方式'。 格式(self.__exp))

返回假

self.__exp=val_exp

返回真

def__convert2postfix_exp(自我):

"""

将中缀表达式转换为后缀表达式

计算北京地铁票价器_etc计算器_有没有etc收费器

:return:theconverted表达式

"""

#最高优先级:()

#中间:*/

#最低:+-

converted_exp=''

stk=堆栈()

forxinself.__exp:

ifself.__is_digit(x)orx=='.':

converted_exp+=x

elifself.__is_operators(x):

converted_exp+=''

tp = stk。 最佳()

iftp:

iftp=='(':

STK。 推(x)

继续

x_pri=self.__get_priority(x)

tp_pri=self.__get_priority(tp)

ifx_pri > tp_pri:

STK。 推(x)

elifx_pri==tp_pri:

converted_exp+=stk.pop()+''

STK。 推(x)

别的:

whilestk.top():

ifself.__get_priority(stk.top())!=x_priority:

converted_exp+=stk.pop()+''

别的:

休息

STK。 推(x)

别的:

STK。 推(x)

elifself.__is_bracket(x):

converted_exp+=''

ifx=='(':

STK。 推(x)

别的:

etc计算器_有没有etc收费器_计算北京地铁票价器

而 stk.top() 和 stk.top() !='(':

converted_exp+=stk.pop()+''

STK。 流行音乐()

#popalltheoperators

whilestk.top():

converted_exp+=''+stk.pop()+''

返回 converted_exp

def__get_result(self, operand_2, operand_1, operator):

ifoperator=='+':

返回操作数_1+操作数_2

elifoperator=='-':

返回操作数_1-操作数_2

elifoperator=='*':

返回操作数_1*操作数_2

elifoperator=='/':

ifoperand_2!=0:

返回操作数_1/操作数_2

别的:

打印('错误:{}:除数不能为零'。格式(self.__exp))

返回无

def__calc_postfix_exp(self, exp):

"""

从转换的后缀表达式中获取结果

例如6523+8*+3+*

:返回:结果

"""

assertisinstance(exp, str)

stk=堆栈()

exp_split = exp.strip().split()

forxinexp_split:

ifself.__is_operators(x):

#poptwotopnumbersinthestack

r=self.__get_result(stk.pop(),stk.pop(),x)

ifris无:

返回无

别的:

STK。 推(r)

别的:

etc计算器_有没有etc收费器_计算北京地铁票价器

#pushtheconvertednumbertothestack

STK。 推(浮动(x))

返回stk。 流行音乐()

def__calc(自我):

"""

尝试获得表达式的结果

:return: 无或结果

"""

#证实

ifself.__validate():

#Convert,然后运行算法得到结果

返回 self.__calc_postfix_exp(self.__convert2postfix_exp())

别的:

返回无

defget_result(自我,表达):

"""

获取表达式的结果

假设我们有一个有效的表达式

:return: 无或结果

"""

self.__exp=expression.strip()

返回 self.__calc()

"""

公用事业

"""

@静态方法

def__is_operators(x):

返回['+','-','*','/']

@静态方法

def__is_bracket(x):

returnxin['(',')']

@静态方法

def__is_digit(x):

返回x.isdigit()

@静态方法

def__get_priority(操作):

ifopin['+','-']:

返回0

elifopin['*','/']:

返回1

更多关于Python实现简单四算术计算器的内容,请关注PHP中文网其他文章()!