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版学习笔记】树——二叉树的应用:解析树
解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...
随机推荐
- 快速了解Hash算法
hash hashcode java 1.hash 2.hash算法 1.hash Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过 ...
- python进程.线程和协程的总结
I.进程: II.多线程threading总结 threading用于提供线程相关的操作,线程是应用系统中工作的最小单位(cpu调用的最小单位). Python当前版本的多线程没有实现优先级,线程组, ...
- C++ Template 编程,泛型编程练习
#include <iostream> #include <string> #include <deque> #include <stdexcept> ...
- linux下获取微秒级精度的时间【转】
转自:https://blog.csdn.net/u011857683/article/details/81320052 使用C语言在linux环境下获得微秒级时间 1. 数据结构 int getti ...
- 普通函数跟箭头函数中this的指向问题
箭头函数和普通函数的区别如下. 普通函数:根据调用我的人(谁调用我,我的this就指向谁) 箭头函数:根据所在的环境(我再哪个环境中,this就指向谁) 一针见血式总结: 普通函数中的this: 1. ...
- 通过uwsgi+nginx启动flask的python web程序
通过uwsgi+nginx启动flask的python web程序 一般我们启动python web程序的时候都是通过python直接启动主文件,测试的时候是可以的,当访问量大的时候就会出问题pyth ...
- Django 配置(一)开启服务
注:这里使用的是命令行创建,当然也可以用 pycharm 自带的 django 项目创建更加简便. 安装django pip install django 创建项目 django-admin star ...
- HashMap遍历的两种方式,推荐使用entrySet()
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { ...
- Python中加入中文注释
最近开发学习Pyton,当加入中文注释时,运行程序报错: File SyntaxError: Non-ASCII character , but no encoding declared; see h ...
- Swift 学习- 05 -- 集合类型
// 集合类型 // swift 提供 Arrays , Sets 和 Dictionaries 三种基本的集合类型用来存储数据 , 数组(Arrays) 是有序数据的集, 集合(Sets)是无序无重 ...