`
ipython
  • 浏览: 293851 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

python 代码实现四则运算 (前缀表达式) 递归 非递归

阅读更多

python 代码实现四则运算 (前缀表达式)

 

计算表达式如下:

(+ 1 2 )

(+ 1 (+ 2 3))

(* (+ 1 2) (*3 4))

 

第一个函数cal_1 是使用递归的形式;

第二个函数cal_2 是使用非递归的形式--堆栈, 且第二个支持多个参数(2个或以上)

 

 

#calculator expression

def cal_1 (s):
    s = s.strip().replace('(','',1)[::-1].replace(')','',1)[::-1].strip()
    if ' ' not in s :
        return float(s)  #just a number
    else:
        tmp = s.split(' ',1)
        opt = tmp[0].strip()
        temp = tmp[1].strip()
        left = 0       
        right = 0
        for i in range(len(temp)):
            if temp[i] == '(':
                left += 1
            if temp[i] == ')':
                right += 1
            if temp[i] == ' ' and left==right :
                break
        
        data1 = temp[:i]
        data2 = temp[i:]

        v1 = cal_1(data1)
        v2 = cal_1(data2)
        if opt == '+':
            return v1 + v2
        elif opt == '-':
            return v1 - v2
        elif opt == '*':
            return v1 * v2
        elif opt == '/':
            return v1 / v2
        elif opt == '%':
            return v1 % v2
        else:
            return 0


def cal_2 (s):
    def cal_exp (exp):
        def cal_exp_two (opt,a,b):
            a = float(a)
            b = float(b)
            if opt == '+':
                return a+b
            elif opt == '-':
                return a-b
            elif opt == '*':
                return a*b
            elif opt == '/':
                return a/b
            elif opt == '%':
                return a%b
            else:
                return 0
        result = exp[1]
        for i in range(2,len(exp)):
            result = cal_exp_two (exp[0],result,exp[i])
        return result
    s = s.replace('(',' ( ').replace(')',' ) ')
    left = s.split()
    right = []
    temp  = []
    while left:
        tmp_left = left.pop().strip()
        if tmp_left == '(':
            tmp_right = right.pop()
            while tmp_right != ')':
                temp.append (tmp_right)
                tmp_right = right.pop()
            right.append (cal_exp(temp))
            temp = []
        else:
            right.append (tmp_left)
    return right[-1]




print cal_1 ( '(- (+ 23 1) (* 3 4))')     #12.0
print cal_1 ( '(- (+ 1 2) (* 3 4))')      #-9
print cal_1 ( '(- 1 1)')                  #0
print cal_1 ( '(- 1 (* 12 12))' )         #-143.0
print cal_1 ( '(- (* 23 2) 12))' )        #34.0
print '----------------------'
#
print cal_2 ( '(- (+ 23 1) (* 3 4))')     #12.0
print cal_2 ( '(- (+ 1 2) (* 3 4))')      #-9
print cal_2 ( '(- 1 1)')                  #0
print cal_2 ( '(- 1 (* 12 12))' )         #-143.0
print cal_2 ( '(- (* 23 2) 12))' )        #34.0
print cal_2 ( '(- (* 23 2 2) 12 ))' )     #80.0

分享到:
评论

相关推荐

    Python基础入门知识之正则表达式学习 正则表达式30分钟入门教程 共21页.pdf

    本教程的目标是让读者快速理解正则表达式的概念,学会基本的语法结构,并能应用到实际的Python代码中,进行字符串匹配和处理。 二、如何使用本教程 建议读者跟随教程的步骤,逐步实践每个例子,加深理解和记忆。...

    数据结构 表达式实现 程序代码 报告齐全

    例如,前缀表达式(也称波兰表示法)和后缀表达式(逆波兰表示法)都是常见的表达式表示方式,它们可以避免括号的使用,通过栈来计算表达式值。对于编译器或解释器设计,词法分析、语法分析和语义分析是表达式实现的...

    表达式求值 算法 代码 报告 流程图

    - **前缀表达式(波兰表示法)**:运算符位于操作数之前,如 `+ a b` 表示 `a + b`。 - **后缀表达式(逆波兰表示法)**:运算符位于操作数之后,如 `a b +` 表示 `a + b`。 - **中缀表达式**:我们最常见的形式...

    数据结构课设——表达式的计算

    5. **前缀表达式**:前缀表达式中,运算符位于操作数之前,如 `* + 2 3 4`。虽然不如后缀表达式常见,但也可以有效地进行表达式计算。 6. **算法设计**:在实现表达式求值器时,需要设计合适的算法。例如,可以使用...

    二叉树表示的算术表达式

    一种常见的方法是使用递归下降解析,这是一种自顶向下、非回溯的解析策略。 在实现过程中,可能会遇到一些挑战,比如处理优先级和括号。优先级决定了运算符的执行顺序,而括号可以改变表达式的结构。例如,"(2 + 3)...

    含变量的表达式求值问题.rar

    7. **代码实现**:使用某种编程语言(如C++、Python、Java等)实现表达式求值算法。代码应该清晰、可读性强,遵循良好的编程规范,以便于他人理解和维护。 8. **测试与调试**:为了确保算法的正确性,需要设计各种...

    prifix_infix.rar_3QVJ_victoryw3k

    前缀表达式的一大优点是不需要括号就能清晰地表示运算的优先级。 **后缀表达式**,又称逆波兰表示法,运算符位于操作数之后。同样的中缀表达式会转换为"2 3 4 * +"。后缀表达式适合用栈来解析,因为操作数先入栈,...

    中缀表达式字符串解析求值

    6. **算法实现**:在编程中,我们可以使用递归下降解析器或使用栈实现的算法来完成这个任务。在Python等语言中,可以创建一个栈来存储操作符,一个队列来存储操作数,并使用循环和条件判断来实现转换和求值。 7. **...

    python-data-structure-cn_python科学计算_python_数据结构_游戏_字典学习_

    中缀前缀和后缀表达式3.10.什么是队列3.11.队列抽象数据类型3.12.Python实现队列3.13.模拟:烫手山芋3.14.模拟:打印机3.15.什么是Deque3.16.Deque抽象数据类型3.17.Python实现Deque3.18.回文检查3.19.列表3.20.无序...

    表达式求值--数据结构

    此外,前缀表达式(前缀记法)也是一种常见的表示方式,运算符位于操作数之前,但通常不如后缀表达式在求值时方便。 除了使用后缀表达式和栈,还可以通过其他数据结构和算法实现表达式求值,例如二叉表达式树...

    Jo.rar_jo

    - **二叉树转前缀表达式**:从根节点开始,递归地对每个节点执行以下操作:先打印操作符,然后打印左子树,最后打印右子树。 - **二叉树转中缀表达式**:同样从根节点开始,先打印左子树,然后打印当前节点的操作符...

    python2与python3区别

    `str()`和`repr()`函数也是Python 2和Python 3之间的区别,`str()`用于创建用户友好的字符串表示,而`repr()`则生成一个合法的Python表达式表示值。在Python 3中,`print`函数不再接受未括号的参数,因此在调用`repr...

    Python3 实现文件批量重命名示例代码

    无论是添加还是删除文件名前缀,都能够轻松实现。掌握了这些基本技巧后,你可以进一步扩展应用范围,例如结合正则表达式进行更复杂的文件名替换等高级操作。希望本篇文章能为你在实际工作中的文件管理带来便利。

    python-3.4.0.zip

    `amd64`前缀表明这是针对64位(x64)架构的安装程序,而没有前缀的文件则是针对32位(x86)系统的。因此,无论你的Windows是32位还是64位,都有对应的安装包可供选择。 Python 3.4.0的关键特性包括: 1. **asyncio...

    python基本语法概述

    - 函数调用自身实现递归操作。 #### 五、模块 1. **模块定义**: - 模块是包含函数和变量的 Python 文件。 - 可以导入其他模块到当前程序中。 2. **导入模块**: - 使用 `import` 语句导入模块: ```python ...

    编译原理语法分析.zip

    包含LL分析法和LR1分析方法,python编写,包含python源代码、实验报告、输入输出文件。 实验报告包含具体实验步骤、LR1预测分析表和LL预测分析程序、代码的数据结构和设计思想。 题目:语法分析程序的设计与实现...

    计算数_将简单的加减乘除括号公式解析成树的结构.zip

    本话题聚焦于“计算数_将简单的加减乘除括号公式解析成树的结构”,这实际上是指将含有加、减、乘、除运算以及括号的数学表达式转换为计算树(也称为操作树或语法树),以便更直观地理解表达式的运算顺序并进行计算...

    经典Python面试题之Python基础篇.docx

    ### 经典Python面试题知识点解析 #### 1. 为什么学习Python? - **易学性**: Python 的语法简洁明了,易于上手,适合初学者快速入门编程。 - **广泛应用**: 在数据科学、Web 开发、自动化脚本、网络爬虫等领域有着...

    python笔试题(2).docx

    7. Unicode编码:在Python 2.7中,用`u`前缀定义Unicode字符串。选项C正确,`a = u'中文'`定义了一个Unicode字符串。 8. 字符串比较:在Python中,字符串比较是逐字符进行的。`'a' 的比较结果是True,因为它判断了`...

    算术表达 式求值

    - **后缀表达式求值**:对于后缀表达式,可以使用一个栈,从左到右扫描表达式,遇到数字就压栈,遇到运算符则弹出栈顶的两个元素进行运算,结果再压回栈,直到扫描完所有字符,最后栈顶的元素就是表达式的结果。...

Global site tag (gtag.js) - Google Analytics