python---数学表达式的分析树实现
先走一遍,
前面很多知道点,都串起来了。
# coding = utf-8 # 使用列表实现栈的功能 class Stack: def __init__(self): self.items = [] # 是否为空 def is_empty(self): return self.items == [] # 进栈 def push(self, item): self.items.append(item) # 出栈 def pop(self): return self.items.pop() # 返回栈顶值,不改变栈 def peek(self): return self.items[len(self.items) - 1] # 返回栈长度 def size(self): return len(self.items) # 使用递归实现二叉树基本功能 class BinaryTree: def __init__(self, root_obj): self.key = root_obj self.left_child = None self.right_child = None def insert_left(self, new_node): node = BinaryTree(new_node) if self.left_child is None: self.left_child = node else: node.left_child = self.left_child self.left_child = node def insert_right(self, new_node): node = BinaryTree(new_node) if self.right_child is None: self.right_child = node else: node.right_child = self.right_child self.right_child = node def get_right_child(self): return self.right_child def get_left_child(self): return self.left_child def set_root_val(self, obj): self.key = obj def get_root_val(self): return self.key # 建立一个算术分析树 def build_parse_tree(fp_exp): fp_list = fp_exp.split() p_stack = Stack() e_tree = BinaryTree('') p_stack.push(e_tree) current_tree = e_tree for item in fp_list: if item == '(': current_tree.insert_left('') p_stack.push(current_tree) current_tree = current_tree.get_left_child() elif item not in ['+', '-', '*', '/', ')']: current_tree.set_root_val(int(item)) parent = p_stack.pop() current_tree = parent elif item in ['+', '-', '*', '/']: current_tree.set_root_val(item) current_tree.insert_right('') p_stack.push(current_tree) current_tree = current_tree.get_right_child() elif item == ')': current_tree = p_stack.pop() else: raise ValueError return e_tree # 匹配加减乘除规则 class DoMatch: @staticmethod def add(op1, op2): return op1 + op2 @staticmethod def sub(op1, op2): return op1 - op2 @staticmethod def mul(op1, op2): return op1 * op2 @staticmethod def true_div(op1, op2): return op1 / op2 # 算术分析式的求值 def evaluate(parse_tree): operator = DoMatch() opers = {'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.true_div } left_c = parse_tree.get_left_child() right_c = parse_tree.get_right_child() if left_c and right_c: fn = opers[parse_tree.get_root_val()] return fn(evaluate(left_c), evaluate(right_c)) else: return parse_tree.get_root_val() # 前序遍历 def pre_order(tree): if tree: print(tree.get_root_val()) pre_order(tree.get_left_child()) pre_order(tree.get_right_child()) # 后序遍历 def post_order(tree): if tree: print(tree.get_root_val()) post_order(tree.get_left_child()) post_order(tree.get_right_child()) # 中序遍历 def in_order(tree): if tree: print(tree.get_root_val()) in_order(tree.get_left_child()) in_order(tree.get_right_child()) # 分析树打印 def print_exp(tree): s_val = '' if tree: s_val = '(' + str(print_exp(tree.get_left_child())) s_val = s_val + str(tree.get_root_val()) s_val = s_val + str(print_exp(tree.get_right_child())) + ')' return s_val pt = build_parse_tree("( ( 7 + 3 ) * ( 5 - 2 ) )") print('=========pre_order================') pre_order(pt) print('=========post_order================') post_order(pt) print('=========in_order================') in_order(pt) print('=========print_exp================') print(print_exp(pt)) print('=========evaluate================') print(evaluate(pt))
=========pre_order================ * + 7 3 - 5 2 =========post_order================ * + 7 3 - 5 2 =========in_order================ * + 7 3 - 5 2 =========print_exp================ (((7)+(3))*((5)-(2))) =========evaluate================ 30
python---数学表达式的分析树实现的更多相关文章
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- (转)Python数学函数
原文:https://www.cnblogs.com/lpl1/p/7793645.html PYTHON-基础-内置函数小结----------http://www.wklken.me/posts/ ...
- 基于语法分析器GOLD Parser开发的数学表达式计算器
最近发现一款文法分析神器,看完官网(http://goldparser.org/)的介绍后感觉很犀利的样子,于是就拿来测试了一番,写了一个数学表达式分析的小程序,支持的数学运算符如下所示:常规运算:+ ...
- 《构建之法》教学笔记——Python中的效能分析与几个问题
<构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...
- #8 Python数学方法
前言 前几节了解了Python的不同数据类型,有小伙伴会问,不同的数据类型之间是否可以相互转换?肯定是可以的,本篇博文主要记录数字类型的转换,其他类型的相互转换会在下几节记录,Here we go! ...
- python金融与量化分析------Matplotlib(绘图和可视化)
-----------------------------------------------------------Matplotlib:绘图和可视化------------------------ ...
- Python数学建模-01.新手必读
Python 完全可以满足数学建模的需要. Python 是数学建模的最佳选择之一,而且在其它工作中也无所不能. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数学 ...
- Python数学建模-02.数据导入
数据导入是所有数模编程的第一步,比你想象的更重要. 先要学会一种未必最佳,但是通用.安全.简单.好学的方法. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数据导入 ...
- 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树
解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...
随机推荐
- golang goroutine 介绍
Goroutine 是用户态自己实现的线程,调度方式遇到IO/阻塞点方式就会让出cpu时间(其实也看编译器的实现,如果TA在代码里面插入一些yield,也是可以的. 反正现在不是抢占式的.) 不能设置 ...
- nc替代技术方案
powershell $client = New-Object System.Net.Sockets.TCPClient('127.0.0.1',4444);$stream = $client.Get ...
- events.py 知识点记录
1.__all__ __all__是一个字符串list,其他模块中使用from xxx import *的时候只能导入__all__列表里的内容 2.sys.version_info 获取版本号 im ...
- Yarn vs npm: 你需要知道的一切
Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具.就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 npm ...
- $Django redis内存数据库 (知识回顾cmd切换目录)
知识小回顾 #切换盘 C:\Users\WangDong>f: F:\> #切换文件 F:\>cd redis F:\redis> #返回上一级 F:\DJ\dj8>cd ...
- Centos、Ubuntu开启命令模式
由于安装的虚拟机本来就比较卡,开机加载图形界面,会变的更卡,使用下面的命令可将图形界面关闭. centos: 开机以命令模式启动,执行: systemctl set-default multi-use ...
- 解决log4j和self4j日志报错Could NOT find resource [logback.groovy]及Could NOT find resource [logback-test.xml]问题
事件背景: 我的log4j和self4j按照网上的配置,配置成功了,但是报错如下: 让我很是郁闷,于是找了一大圈........ 解决方案: 总结来说就是:log4j.properties和logba ...
- mvc 母版页保持不刷新
//比如这是左边菜单栏 <ul class="treeview-menu" id="left_menu"> <li><a href ...
- 任意N位二进制的补码实现——队列存放
正在学习计算机组织与结构,为了写一些底层的算术操作模拟,比如一个二进制补码数的加减乘除,发现这很麻烦,因为不管是什么语言,都只提供了8位.32.64位等部分位数的补码形式,那么怎么实现任意任意位的补码 ...
- Gym - 101775A Chat Group 组合数+逆元+快速幂
It is said that a dormitory with 6 persons has 7 chat groups ^_^. But the number can be even larger: ...