python 二叉树计算器

时间:2023-03-09 20:48:26
python 二叉树计算器

例子:计算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)))