今天看了一遍《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
分享到:
相关推荐
在数据结构课程设计中,"二叉树表示的算术表达式"是一个常见的主题,它涉及到计算机科学的基础概念,特别是二叉树、数据结构以及如何用它们来解析和操作算术表达式。在这个项目中,我们将深入探讨这些知识点,并了解...
在计算领域,二叉树可以用来表示算术表达式。这种表示方式称为二叉表达树(或运算符优先树)。每个内部节点代表一个运算符,而叶节点则代表操作数。例如,对于表达式 "A + B * C",对应的二叉树将有一个加号节点作为...
算术表达式常见的表示方式有前缀(prefix)、中缀(infix)和后缀(postfix)表示法。中缀是我们最常见的形式,如2 + 3 * 4。前缀表示法使用运算符在操作数前面,如+ 2 3 * 4。后缀表示法,也称为逆波兰表示法,...
接着,Yacc(Yet Another Compiler-Compiler)是一个语法分析器生成器,它根据一套语法规则(通常以巴科斯范式或扩展巴科斯范式表示)来解析由Lex生成的tokens,构建抽象语法树(AST),并执行必要的计算。...
在实际编程中,我们可能需要构建一个二叉树来表示给定的算术表达式,然后实现后序遍历算法进行求值。这个过程中会涉及到字符串解析,识别运算符和操作数,以及构建合适的二叉树结构。此外,还需要考虑处理括号,因为...
本项目是基于C++实现的“算术表达式的LR翻译器”,它包含了LR分析树和分析表的生成过程,这些都是编译器设计的关键组成部分。以下是关于这个主题的详细知识解释: **LR分析器**: LR分析器(Left-to-right, ...
四元式是一种表示算术或逻辑运算的抽象语法树(AST)的简单形式,它以四元组的形式存储每个操作,通常包括操作符、操作数以及相关的属性。这个过程涉及到词法分析、语法分析和语义分析等编译阶段。 首先,我们需要...
本主题“算术表达式的词法分析”聚焦于如何处理包含算术运算的源代码片段。 词法分析器,也被称为扫描器或词法分析器,它的主要任务是从源代码中识别出符合语法规则的最小单元,例如数字、运算符、标识符、关键字和...
2. **语法分析**:依据算术表达式的语法规则(如BODMAS规则:括号优先、指数次方、乘除、加减),构建一个抽象语法树(AST)。AST是一种数据结构,它以树的形式表示了表达式的结构,每个节点代表一个操作或值。 3. ...
例如,"2 + 3 * 4"就是一个简单的算术表达式,它表示2加上3与4的乘积。 在Java中,解析算术表达式通常涉及以下几个关键步骤: 1. **词法分析**:也称为扫描,是将输入的字符串(算术表达式)分解为一系列的标记...
在IT领域,算术表达式的求值是一项基础且重要的任务,尤其在编程语言如C和C++中。本文将深入探讨算术表达式求值的原理、方法以及相关的编程实践,以"算术表达式求值演示1"为例,解析其中涉及到的知识点。 首先,...
本项目是一个基于Yacc(Yet Another Compiler-Compiler)的程序,用于将用户输入的中缀算术表达式转化为等价的后缀表达式,也被称为逆波兰表示法。Yacc是一种自顶向下、递归下降的解析器生成器,通常与词法分析器...
实验报告的主题是“编译原理”,具体关注算术表达式的语法分析与中间代码生成原理。在编译器设计中,这个阶段通常被称为词法分析、语法分析和代码生成。 一、算术表达式四元式翻译文法 四元式是一种用于表示中间...
标题 "简单的LISP算术表达式计算器" 涉及的核心技术是LISP语言和计算器的设计,这通常是一个计算机科学教育中的课程设计项目。LISP(LISt Processing)是一种古老而强大的编程语言,以其独特的括号表示法和对递归的...
2. **前缀、中缀和后缀表达式**:算术表达式在二叉树中的表示通常与前缀(逆波兰)、中缀(常规)和后缀(波兰)表达式有关。前缀表达式将运算符放在操作数前面,后缀表达式将运算符放在操作数后面,而中缀表达式是...
三、二叉树表示算术表达式的构建 1. 前缀表示(Prefix notation):运算符位于操作数之前,如“*+234”,适合用递归定义的二叉树表示。 2. 后缀表示(Postfix notation):运算符位于操作数之后,如“23*4+”,同样...
总的来说,这次课程设计旨在让学生掌握编译原理的基本概念,特别是词法分析和语法分析,通过实现LR分析器处理算术表达式,并使用四元式来表示和简化表达式结构。这样的实践有助于理解编译器的工作原理,对未来的软件...
本文将深入探讨一个特定的主题——"算术表达式求值",这是数据结构应用的一个实例,主要涉及编译原理、解析器设计以及C++编程语言。 算术表达式求值是指对包含加、减、乘、除等运算符的数学表达式的计算过程。在...
2. **语法分析**:根据算术表达式的语法规则,将符号序列转换为抽象语法树(AST)。AST以树形结构表示了表达式的结构,便于后续操作。 3. **计算**:从AST的根节点开始,进行前序遍历或者后序遍历,执行相应的运算...
在数据结构的学习中,算术表达式与二叉树的关系是一个重要的主题。Java作为一种流行的编程语言,被广泛用于实现各种数据结构,包括二叉树。本篇将详细讲解基于Java的算术表达式与二叉树相关的知识点。 一、算术...