例子:计算1+2+3+4的值

代码:

class Buffer(object):
"""字符串处理函数""" def __init__(self, str_value):
self._str_value = str_value
self._off_set = def peek(self):
if self._off_set >= len(self._str_value):
return None
else:
return self._str_value[self._off_set] def advance(self):
self._off_set += class Token(object):
"""定义节点类型,{int,2}{ope,+}""" def consum(self, buffer):
pass class TokenInt(Token):
"""整数节点类型{int,2}""" def consum(self, buffer):
accu = ""
while True:
ch = buffer.peek()
if ch is None or ch not in "":
break
else:
accu += ch
buffer.advance()
if accu != "":
return "int", int(accu)
else:
return None class TokenOperator(Token):
"""操作符接点类型,返回{ope,+}""" def consum(self, buffer):
ch = buffer.peek()
if ch is not None and ch in "+-":
buffer.advance()
return "ope", ch
else:
return None class Node(object):
"""节点"""
pass class NodeInt(Node):
"""整数节点""" def __init__(self, value):
self.value = value class NodeOpe(Node):
"""加减节点""" def __init__(self, kind):
self.kind = kind
self.left = None
self.right = None def get_tokens(string):
"""根据string获取节点类型数组"""
buffer = Buffer(string)
tk_int = TokenInt()
tk_ope = TokenOperator()
tokens = [] while buffer.peek():
token = None
for tk in (tk_int, tk_ope):
token = tk.consum(buffer)
if token:
tokens.append(token)
break
if not token:
raise ValueError("Error in syntax")
return tokens def parse(tokens):
"""将tokens生成二叉树"""
# 判断第一个是不是数字
if tokens[][] != 'int':
raise ValueError('Error in syntax')
# 新建第一个节点
node = NodeInt(tokens[][])
# 下一个节点
node_next = None
# 节点类型
node_type = tokens[][]
for token in tokens[:]:
# 判断节点类型是否一致
if token[] == node_type:
raise ValueError("error in syntax")
node_type = token[]
# 判断是什么操作符
# 如果是符号
if token[] == 'ope':
node_next = NodeOpe(token[])
node_next.left = node
if token[] == 'int':
node_next.right = NodeInt(token[])
node = node_next
return node def calculate(node):
"""迭代求值"""
if isinstance(node.left, NodeOpe):
left_value = calculate(node.left)
else:
left_value = node.left.value if node.kind == '-':
return left_value - node.right.value
elif node.kind == '+':
return left_value + node.right.value
else:
raise ValueError('Error in syntax') def evalute(node):
"""判断是否只有一个数值"""
if isinstance(node, NodeInt):
return node.value
else:
return calculate(node) if __name__ == '__main__':
input_str = input("input:")
tokens = get_tokens(input_str)
node = parse(tokens)
print("value is {}".format(evalute(node)))

python 二叉树计算器的更多相关文章

  1. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  2. python实现计算器

    计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...

  3. python之计算器(第四天)

    作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...

  4. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

  5. Python科学计算器(计算器)

    说明 该计算器主要是为了练习正则表达式以及python基础所写:代码比较low! 运行过程 请输入你的计算公式, 计算器会将计算结果输出到屏幕上(此处会打印步骤); 退出(exit/quit) MyC ...

  6. Python数学运算入门把Python当作计算器

    让我们尝试一些简单的 Python 命令.启动解释器,等待界面中的提示符,>>> (这应该花不了多少时间). 3.1.1. 数字 解释器就像一个简单的计算器一样:你可以在里面输入一个 ...

  7. python之计算器

    开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...

  8. [IT学习]转载python 项目 计算器

    这个是从网上搜到的Python小项目之计算器(原文地址:http://www.2cto.com/kf/201402/279637.html).但该段代码估计是Python 2 写的. 如果你使用的程序 ...

  9. Python --- 二叉树的层序建立与三种遍历

    二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有....(此处省略好多字)....等的优良特点. 之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结 ...

随机推荐

  1. Java第四次实训作业

    1.编写“电费管理类”及其测试类. 第一步 编写“电费管理”类1)私有属性:上月电表读数.本月电表读数2)构造方法:无参.2个参数3)成员方法:getXXX()方法.setXXX()方法4)成员方法 ...

  2. R 拆分EXCEL成多个文件

    setwd("C:/Rworkfile") install.packages("readxl") library(readxl) www<-read_ex ...

  3. python pandas使用chunksize异步拆分固定行数的文件

    import pandas as pd import asyncio from collections import defaultdict collect = defaultdict(list) # ...

  4. python pandas使用一些协程

    import pandas as pd def coroutine(func): """装饰器:向前执行到第一个`yield`表达式,预激`func`"&quo ...

  5. oracle 层次化查询(生成菜单树等)

    1.简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id). 2.层次化查询主要包含两个子句 ...

  6. OC总结 【OC基础语法相关知识】

    m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...

  7. springboot jpa 多条件查询(单表)

    需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...

  8. C#实现Javascript的Splice方法

    最近开始学习Javascript语言,看到splice方法,以下引用其说明:该方法是一个通用删除和插入元素的方法,它可以在数组指定的位置开始删除或插入元素.其包括3个参数:第一个参数指定插入的起始位置 ...

  9. visual studio 安装与sqlserver 安装

    先sqlserver再visual studio ,避免安装目录重复(sqlserver 中包含一部分visual  而  visual studio 中也包含有部分sqlserver内容) 安装vi ...

  10. SSH框架整合中Hibernate实现Dao层常用结构

    一.疑惑 一直以来,我在使用SSH框架的时候经常会发现后者有疑虑到底使用hibernate的那种方法或者如何配置hibernate来操作数据库,经过 一段时间的学习下面我来总结一下,常用的dao层配置 ...