网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月07日漏签0天
python吧 关注:479,953贴子:1,981,835
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 25回复贴,共1页
<<返回python吧
>0< 加载中...

有木有大佬会把表达式转化为二叉树?

  • 只看楼主
  • 收藏

  • 回复
  • @𝙿𝚢Py水晶兰
  • 榜眼
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
比如说表达式“-1+2/sin(3+4-5)**((6-7*8)/9)+9*8%7/6*5*exp(4+3)//2-1”经过tokens分割后得到
[('-', 'O'), ('1', 'N'), ('+', 'O'), ('2', 'N'), ('/', 'O'), ('sin', 'F'), ('(', 'B'), ('3', 'N'), ('+', 'O'), ('4', 'N'), ('-', 'O'), ('5', 'N'), (')', 'B'), ('**', 'O'), ('(', 'B'), ('(', 'B'), ('6', 'N'), ('-', 'O'), ('7', 'N'), ('*', 'O'), ('8', 'N'), (')', 'B'), ('/', 'O'), ('9', 'N'), (')', 'B'), ('+', 'O'), ('9', 'N'), ('*', 'O'), ('8', 'N'), ('%', 'O'), ('7', 'N'), ('/', 'O'), ('6', 'N'), ('*', 'O'), ('5', 'N'), ('*', 'O'), ('exp', 'F'), ('(', 'B'), ('4', 'N'), ('+', 'O'), ('3', 'N'), (')', 'B'), ('//', 'O'), ('2', 'N'), ('-', 'O'), ('1', 'N')]
这里的元组中前面表示token内容,后面表示token类型,定义:
bracket = "B"
function = "F"
number = "N"
operator = "O"
variable = "V"
然后根据这个列表如何构建二叉树?


  • 贴吧用户_JG6y44P
  • 进士
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
仅供参考:
https://paste.org.cn/Rocm80ZQlA


2025-12-07 12:55:03
广告
不感兴趣
开通SVIP免广告
  • xelloss_sc
  • 探花
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这不难吧,最简单的用个循环就行了吧,遇到多字符按最大先判断,不满足逐渐缩短判断。


  • 无限的开始
  • 贡士
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以用ast库直接生成语法树


  • hhahahh
  • 白丁
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
总递归应该可以


  • 水面上的小草
  • 白丁
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
初学者,好高级好难。


  • 消失了的空白
  • 白丁
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
创建一个二叉树,深度的话算一下就好了。按照前序遍历的顺序把你分割得到的东西依次写进去。
但是如果你正儿八经想生成一个二叉树的话。
先处理下token,如果以-+开头则在前面加个0,*/直接报错,
得先来个栈,根据运算符号优先级和括号弹出要处理的部分。
处理起来的话你可以写个规则,具体说起来很麻烦,你可以看下图,你这个token前半截可以考虑生成这样的数,大概就是数字放在叶子结点,其他符号放在父节点里。括号不需要,因为会体现在你运算的顺序里。sin这种下面的两个节点应该有一个是空的。


  • 炒饭只放一勺盐
  • 白丁
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
传统办法就先生成多叉的符号解析树 再合并掉冗余节点 变成二叉树


2025-12-07 12:49:03
广告
不感兴趣
开通SVIP免广告
  • 无限的开始
  • 贡士
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用ast.parse方法,具体的数据结构可以debug来看。比如ast.BinOp代表是个二元运算,有左右操作数left,right,及运算符op,ast.Add是加法。具体各种节点类型代表什么可以查文档或问AI.


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 25回复贴,共1页
<<返回python吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示