鱼C论坛

 找回密码
 立即注册
查看: 1701|回复: 2

照着敲了代码 但是不知道怎么测试 数据结构 语义树 算数式计算 递归 栈

[复制链接]
发表于 2020-2-17 15:12:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学二叉树照着老师写的代码 内容是把数学表达式拆成二叉树在计算 比如((3+5)*(3-1))这样的  第一第二块就是定义栈和二叉树 第三部分拆成树 第四部分递归计算 我不知道该怎么验证我写的对不对 后面那几行都是我自己写的但是运行没有任何输出

  1. class Stack:    # 定义一个栈类
  2.      def __init__(self):
  3.          self.items = []

  4.      def isEmpty(self):
  5.          return self.items == []

  6.      def push(self, item):
  7.          self.items.append(item)

  8.      def pop(self):
  9.          return self.items.pop()

  10.      def peek(self):
  11.          return self.items[len(self.items)-1]

  12.      def size(self):
  13.          return len(self.items)

  14. class BinTree:  # 定义一个二叉树类以及其方法
  15.     def __init__(self, rt_obj):
  16.         super().__init__()
  17.         self.key = rt_obj
  18.         self.l_child = None
  19.         self.r_child = None

  20.     def ins_l(self, new_n):
  21.         if self.l_child == None:
  22.             self.l_child = BinTree(new_n)
  23.         else:
  24.             t = BinTree(new_n)
  25.             t.l_child = self.l_child
  26.             self.l_child = t

  27.     def ins_r(self, new_n):
  28.         if self.r_child == None:
  29.             self.r_child = BinTree(new_n)
  30.         else:
  31.             t = BinTree(new_n)
  32.             t.r_child = self.r_child
  33.             self.r_child = t

  34.     def get_root_val(self):
  35.         return self.key

  36.     def set_root_val(self, key):
  37.         self.key = key

  38.     def get_l_child(self):
  39.         return self.l_child

  40.     def get_r_child(self):
  41.         return self.r_child




  42. def build_parsetree(fpexp):     # 把表达式拆分成一个二叉树
  43.     fplist = []
  44.     for i in fpexp:
  45.         fplist.append(i)        # 拆分表达式存到一个空列表里
  46.     pStack = Stack()    # 定义一个空栈
  47.     eTree = BinTree('')     # 空二叉树
  48.     pStack.push(eTree)      # 入栈
  49.     cur_tree = eTree    # 追踪扫描的字符
  50.     for i in fplist:
  51.         if i == '(':     
  52.             cur_tree.ins_l('')      # 左括号加一个子树
  53.             pStack.push(cur_tree)       # 入栈
  54.             cur_tree = cur_tree.get_l_child()       # 追踪扫描的字符
  55.         elif i not in [')', '+', '-', '*', '/']:    # 运算数
  56.             cur_tree.set_rt_val(int(i))     # 结点设置为运算数的值
  57.             parent = pStack.pop()   
  58.             cur_tree = parent       # 出栈 追踪扫描光标
  59.         elif i in ['*', '+', '-', '/']:     # 运算符   
  60.             cur_tree.set_rt_val(i)          # 节点设置为运算符
  61.             cur_tree.ins_r('')              # 添加一个右子树
  62.             pStack.push(cur_tree)           # 下沉入栈
  63.             cur_tree = cur_tree.get_r_child()       # 追踪扫描光标
  64.         elif i == ')':          # 右括号
  65.             pStack.pop()        # 出栈            
  66.         else:
  67.             raise ValueError
  68.     return eTree

  69. import operator as op

  70. def evaluate(parse_tree):       # 递归求值 这段我自己不是太懂
  71.     ops = {'+': op.add, '-': op.sub, '*': op.mul, '/': op.truediv}
  72.     # 定义一个运算符字典
  73.     l = parse_tree.get_l_child()
  74.     r = parse_tree.get_r_child()        

  75.     if l and r:
  76.         fn = parse_tree.get_root_val()
  77.         return fn(evaluate(l), evaluate(r))
  78.     else:
  79.         print('hello world')
  80.         return parse_tree.get_root_val()
  81.         

  82. m = "((3+2)*(4-2))"         # 这段我自己写的想测试下这个程序 但是没反应
  83. n = build_parsetree(m)
  84. n.get_root_val()
  85. o = evaluate(n)
  86. print(o)



复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-17 15:13:22 | 显示全部楼层
大概写了点注释 大家凑合看吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-17 23:34:59 | 显示全部楼层
弄好了 bug出在没有跟踪好光标 line 81             pStack.pop()        # 出栈     应该改成           cur_tree = pStack.pop()        # 出栈     
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-22 13:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表