当前位置: 首页 > java >正文

C语言编程--二叉树--构建解析树

完整代码示例

  • 构建解析树
  • 操作解析树
    • 生成对应的中缀表达式(中序遍历解析树)
    • 生成对应的后缀表达式(后序遍历解析树)
    • 生成对应的求值机器码(后序历解析树)

框架代码:

#include <stdio.h>
#include <stdlib.h>char *a;int i;typedef struct Tnode* link;struct Tnode {char token;link l;link r;
};link NEW(char token, link l, link r);
link parse();
void visit(link h);
void trav_in(link h, void(*visit)(link));
void trav_post(link h, void(*visit)(link));
void visit_codegen(link h);int main(){i = 0;char input[] = {'*', '+', 'a', '*', '*', 'b', 'c', '+', 'd', 'e', 'f'};a = input;//构建前缀表达式对应的解析树link root = parse();// show(root, 4);//中序遍历得到对应的中缀表达式trav_in(root, visit);printf("\n");//后序遍历得到对应的后缀表达式trav_post(root, visit);printf("\n");//后序遍历生成对应的求值机器码trav_post(root, visit_codegen);return 0;
}

任务1:构建前缀表达式的解析树

link NEW(char token, link l, link r){link x = malloc(sizeof(*x));x->token = token;x->l = l;x->r = r;return x;
}
link parse(){char t = a[i++];link x = NEW(t, NULL, NULL);if ((t == '*') || t == '+') {x->l = parse();x->r = parse();}return x;
}

任务2:生成对应的中缀表达式

中序遍历解析树

void visit(link h){printf("%c ", h->token);
}void trav_in(link h, void(*visit)(link)){if (h == NULL) {return ;}trav_in(h->l,visit);(*visit)(h);trav_in(h->r, visit);
}

任务3:生成对应的后缀表达式

后序历解析树

void trav_post(link h, void(*visit)(link)){if (h == NULL) {return ;}trav_post(h->l,visit);trav_post(h->r, visit);(*visit)(h);
}

任务4:生成对应的求值机器码

后序历解析树

void visit_codegen(link h){if (h == NULL) {return ;}if (h->token == '*') {printf("MULTIPLY\n");}else if (h->token == '+') {printf("ADD\n");}else {printf("LOAD %c\n", h->token);}
}
http://www.xdnf.cn/news/5899.html

相关文章:

  • iOS - 如何从appStore获取app版本信息
  • 各类芒果(果实、叶片、产量等)相关数据集
  • Python爬虫实战:研究JavaScript 环境补全逆向解密
  • SQLMesh信号机制详解:如何精准控制模型评估时机
  • CSS可以继承的样式汇总
  • 【言语】刷题3
  • 串口模块详细讲解
  • IO、存储、硬盘、文件系统相关常识
  • 【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析
  • 十天学会嵌入式技术之51单片机—day-9
  • 【技巧】使用UV创建python项目的开发环境
  • 面试篇:Spring Security
  • C语言—再学习(数据的存储类别)
  • C++ 字符格式化输出
  • python学习笔记七(文件)
  • 分布式链路跟踪
  • lubuntu 系统详解
  • WebpackVite总结篇与进阶
  • Java SpringMVC 和 MyBatis 整合项目的事务管理配置详解
  • DeepSeek 赋能汽车全生态:从产品到服务的智能化跃迁
  • 2025年5月13日第一轮
  • vue3父子组件传值
  • 数据治理域——日志数据采集设计
  • c++STL-list的模拟实现
  • conda 输出指定python环境的库 输出为 yaml文件
  • K230 ISP:一种新的白平衡标定方法
  • AcroForm 格式化文本(域)字段
  • ElasticSearch父子关系数据建模
  • MySQL命令行导出数据(docker版本)
  • 运行Spark程序-在shell中运行1