`
mirguest
  • 浏览: 3133 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

表示算术表达式的树

阅读更多

今天看了一遍《C++沉思录》的第八章,作者使用c++实现了表示算术表达式的树。

就是像 (-3)*(3+3)的树就是:



然后,我就用python实现了一下。因为python与C++不同,(作者使用了句柄类),我这里就没考虑这么多。

下面是实现:

# -*- coding:utf-8 -*-
class One_node(object):
    def __init__(self,n):
        self.n=n
    def __str__(self):
        return str(self.n)

class Unary_node(object):
    def __init__(self,op,n):
        self.op=op
        self.n=n
    def __str__(self):
        return "("+self.op+str(self.n)+")"
class Binary_node(object):
    def __init__(self,op,left,right):
        self.op=op
        self.left=left
        self.right=right
    def __str__(self):
        return "("+str(self.left)+self.op+str(self.right)+")"
class Ternary_node(object):
    def __init__(self,left,middle,right):
        self.left=left
        self.middle=middle
        self.right=right
    def __str__(self):
        return "("+str(self.left)+"?"+str(self.middle)+":"+str(self.right)+")"

def Expr(*argc):
    if len(argc)==1:
        return One_node(*argc)
    elif len(argc)==2:
        return Unary_node(*argc)
    elif len(argc)==3:
        return Binary_node(*argc)

if __name__=="__main__":
    x=Expr(10)
    print x
    x=Expr("-",10)
    print x
    x=Expr("*",2,10)
    print x
    x=Expr("*",Expr(10),Expr("-",3))
    print x
    x=Expr("*",x,x)
    print x
    x=Ternary_node(x,x,x)
    print x


可以看到,非常方便。
  • 大小: 7.8 KB
0
1
分享到:
评论

相关推荐

    四则混合运算表达式树处理

    (1) 以逆波兰表示输入的算术表达式(假设每个操作数都以单字符字母表示,即操作数的标 识符为一个字母); (2) 初始化表达式树; (3) 生成表达式树; (4) 输出表达式树的各种遍历的结果; (5) 打印表达式...

    利用二叉树计算后缀表达式

    输入一表达式,将其用表达式树表示,并用表达式数计算表达式的值。

    ExpressionParser:算术表达式的解析器和树表示

    算术表达式的解析器和树表示 该程序将递归树表示形式用于算术表达式(复合模式)。 它从输入中读取此类表达式并对其进行解析,就像编程语言的编译器一样。 解析器通过递归下降操作。 一旦存储在树表示中,就可以对...

    表达式求值,用二叉树

    表达式求值,用二叉树来表示以后,进行遍历求解。

    四则混合运算表达式处理

    (1) 以逆波兰表示输入的算术表达式。 (2) 输出表达式树的各种遍历的结果。 (3) 打印表达式树。 (4) 删除表达式树。

    山东大学数据结构课设表达式类型 源.cpp

    基于二叉树表示的算术表达式Expression的操作。 假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,-,*,/,^(乘幂))。实现以下操作: (1)ReadExpr(E)――以字符序列的形式...

    树与二叉树算法总结

    树与二叉树的详细算法,很全 以二叉树表示算术表达式 建立二叉树算法 以及一些习题

    C++树算法精析c++经典

    c++树算法精析!树与二叉树算法汇总 1.以二叉树表示算术表达式,根结点用于存储运算符。若能先分别求出左子树和右子树表示的子表达式的值,最后就可以根据

    采用算符优先分析法对表达式进行分析

    文法:无二义性的算术表达式的文法 (1)把词法分析作为语法分析的子程序实现(5分) (2)独立的语法分析程序(4分) (3)构造算符优先关系表 (4)算符优先关系表可以直接输入(4分),也可以用程序实现(5分) ...

    数据结构实验报告(3).docx

    数据结构实验报告 吴宗翰09013221 缪宇坤 实验题目1: 实验一单链表应用 编写算法,完成: 1、用单链表存储...3、输入为表示算术表达式的一个字符串,输出结果应为表达式的计算值。 实验内容: 数据结构实验报告(3)

    C语言实现堆排序、用栈实现表达式求值、B+树和红黑树

    在Linux环境下运用gedit工具,通过C语言编程实现四个程序,分别为:堆排序、用栈实现表达式求值、B+树和红黑树。 利用大顶堆(或小顶堆)堆顶记录的是最大关键字(或最小关键字)这一特性,使得每次从无序中选择...

    Arithmetic-Expression-Interpreter:实现了递归下降解析器,以将数学表达式转换为树表示形式(中缀,前缀和后缀)。 使用访问者模式来评估表达式的值

    •开发了递归下降解析器,将数学表达式转换为树表示形式(中缀,前缀和后缀) •编码逻辑以遍历树的中缀表示并使用堆栈评估表达式 •实现了访问者模式,以将树转换为前缀/后缀中的链表,并评估了表达式的值

    .NET设计模式(11):组合模式(CompositePattern)

    组合模式有时候又叫做部分-整体模式,它使我们树型结构的...虽然例子抽象一些,但是算术表达式确实是组合的例子。算术表达式包括操作数、操作符和另一个操作数。操作数可以是数字,也可以是另一个表达式。这样,2+3和

    java数据结构与算法第二版

    解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验...

    Java数据结构和算法(第二版)

    解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 ...

    数据结构课程设计 ----个人设计报告

    (3)假设一个算术表达式中包含圆括号,方括号和花号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数correct(exp,tag);其中:exp为字符串类型量,表示被判别的表达式,tag为布尔型的变量。 (4)...

    Java数据结构和算法中文第二版

    解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验...

    PEG:解析器表达式语法的解析器组合器库

    calc.js,它直接计算标准算术表达式 calcAST.js 的值,它根据抽象语法树生成中间表示,并具有两个计算函数——一个用于从 AST 计算表达式的值,另一个用于计算表达式的值将表达式转换为波兰语符号。 这是解析器...

Global site tag (gtag.js) - Google Analytics