`
hojor
  • 浏览: 106635 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

生成表达式树

阅读更多

栈及中缀表达式转后缀表达式的实现看之前的日志

 

 

//>>>>>>mocro.h

#ifndef _MACRO_H_
#define _MACRO_H_

#define EmptyTOS (-1)
#define MinStackSize (5)
#define ElementType int

#endif

//>>>>>>struct.h

#ifndef _STRUCT_H_
#define _STRUCT_H_
#include "macro.h"

/*< stack struct */
typedef struct StackRecord
{
       int Capacity;
       int TopOfStack;
       ElementType * Array;
}STACK_RECORD;

typedef STACK_RECORD * Stack;

/*< tree struct*/
typedef struct TreeNode
{
       int        value;
       TreeNode   *     Left;
       TreeNode   *     Right;
}TreeNode;

typedef TreeNode * Tree;

#endif

//>>>>>>stack.h

#ifndef _STACK_H_
#define _STACK_H_
#include "macro.h"
#include "struct.h"

//清空栈
void MakeEmpty(Stack S);

//生成容量为MaxElements的栈
Stack CreateStack(int MaxElements);

//判断栈是否为空
int IsEmpty(Stack S);

//判断栈是否已满
int IsFull(Stack S);

//释放所有栈空间
void DisposeStack(Stack S);

//进栈
void Push(ElementType X,Stack S);

//出栈
void Pop(Stack S);

//返回栈顶数据
ElementType Top(Stack S);

//出栈并返回数值
ElementType TopAndPop(Stack S);

#endif

//>>>>>>tree.h
#ifndef _TREE_H_
#define _TREE_H_
#include "macro.h"
#include "struct.h"
#include "stack.h"

//清空树
void ClearTree(Tree t);

//创建节点
Tree CreateNode(int x);

//先序遍历
void Preorder_TreePrint(Tree t);

//中序遍历
void Inorder_TreePrint(Tree t);

//后续遍历
void Postorder_TreePrint(Tree t);

#endif

//>>>>>infix_suffix_conv.h

#ifndef _INFIX_SUFFIX_CONV_
#define _INFIX_SUFFIX_CONV_

#include "macro.h"
#include "struct.h"
#include "stack.h"

//获得符号优先级
int getLevel(char symbol);

//判断字符是否为符号
int isSymbol(char ch);

//中缀表达式转后缀表达式
void infix_suffix_convert(char * infixStr,char * suffixStr);

#endif

//>>>>>>expTree.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"tree.h"
#include "infix_suffix_conv.h"

//清空树
void ClearTree(Tree t)
{
	if(t!=NULL)
	{
		ClearTree(t->Left);
		ClearTree(t->Right);
		free(t);
	}
}
//创建节点
Tree CreateNode(int x)
{
	Tree tree = (Tree)malloc(sizeof(TreeNode));
	tree->value = x;
	tree->Left = NULL;
	tree->Right = NULL;
	return tree;
}
//先序遍历
void Preorder_TreePrint(Tree root)
{
	if(root!=NULL)
	{
		if(root->Left == NULL && root->Right == NULL)
			printf("%d ",root->value);
		else
			printf("%c ",root->value);
		Preorder_TreePrint(root->Left);
		Preorder_TreePrint(root->Right);
	}
}
//中序遍历
void Inorder_TreePrint(Tree root)
{
	if(root!=NULL)
	{
		Inorder_TreePrint(root->Left);
		if(root->Left == NULL && root->Right == NULL)
			printf("%d ",root->value);
		else
			printf("%c ",root->value);
		Inorder_TreePrint(root->Right);
	}
}
//后续遍历
void Postorder_TreePrint(Tree root)
{
	if(root!=NULL)
	{
		Postorder_TreePrint(root->Left);
		Postorder_TreePrint(root->Right);
		if(root->Left == NULL && root->Right == NULL)
			printf("%d ",root->value);
		else
			printf("%c ",root->value);
	}
}

//生成表达式树
Tree expTree(char * suffixStr)
{
	Stack treeStack = CreateStack(20);
    int iCount = strlen(suffixStr),i,j,k,flag,n;
     i=j=k=n=flag=0;
     for(i=0;i<=iCount;i++)
     {
         if(isSymbol(suffixStr[i]))
         {
			Tree tree = (Tree)malloc(sizeof(TreeNode));
            tree->value = suffixStr[i];

			if(!IsEmpty(treeStack))
				tree->Right = (Tree)TopAndPop(treeStack);
			else
				tree->Right = NULL;

			if(!IsEmpty(treeStack))
				tree->Left = (Tree)TopAndPop(treeStack);
			else
				tree->Left = NULL;

			if(!IsFull(treeStack))
				Push((int)tree,treeStack);
			else
				printf("The stack is full!\n");

			flag=2;
         }
         else if(suffixStr[i]>='0' && suffixStr[i]<='9')
         { 
			 if(flag == 2 || flag == 0)
			 {
				Tree node = CreateNode(atoi(&suffixStr[i]));
				if(!IsFull(treeStack))
					Push((int)node,treeStack);
				else
					printf("The stack is full!\n");
				flag = 3;
			 }
         }
         else
         {
             flag = 2;
         }
     } 

	 if(!IsEmpty(treeStack))
		 return (Tree)TopAndPop(treeStack);
	 else
		 return NULL;
}
////main
int main(void)
{
	char * infix = "(1+2323)*55/26+83-(77+2)*32";
	char suffix[100];
	memset(suffix,0,sizeof(suffix));
	infix_suffix_convert(infix, suffix);
	puts(suffix);
	///----
	Tree root = expTree(suffix);
	Postorder_TreePrint(root);
	putchar('\n');
	ClearTree(root);
    return 0;
}
 

 

分享到:
评论

相关推荐

    四则混合运算表达式树处理

    (3) 生成表达式树; (4) 输出表达式树的各种遍历的结果; (5) 打印表达式树; (6) 删除表达式树; (7) 设计相应的“菜单”,通过键盘输入选择,完成实验要求的测试。 [选作内容] 按C++语法规则的形式输入...

    表达式解析之表达式树的建立

    在上一阶段对字元提取的基础上,完成了表达式树的构建,通过这一表达式树的建立,可以很容易生成可顺序执行的基于堆栈的代码,这在脚本解析系统,已经编译器中是一个重要的部分。

    C#用表达式树构建动态查询的方法

    比如,LINQ提供了用来查询关系数据源的IQueryable接口的实现,C#编译器在执行这类数据源查询时,会在运行时生成表达式树,然后,查询会遍历表达式树的数据结构,然后将其转换成针对特定数据源的合适的查询语言。...

    ASP.NET Core中如何使用表达式树创建URL详解

    表达式树(Expression Tree) 表达式树是不可执行的代码,它只是用于...2.完成类似反射访问未知对象的属性,通过动态构造表达式树,生成委托。 当我们在ASP.NET Core中生成一个action的url会这样写: var url=_urlHelp

    用Java编写的最小生成树代码

    用Java编写的最小生成树代码,非常有用的东西,希望大家多多支持。

    C#简单实现表达式目录树(Expression)

    表达式目录树以数据形式表示语言级别代码。数据存储在树形结构中。表达式目录树中的每个节点都表示一个表达式。这篇文章给大家介绍C#简单实现表达式目录树(Expression),需要的朋友参考下吧

    Expression解析生成SQL.zip

    Expression是一个可以将Expression表达式树解析成Transact-SQL的项目。只要调用者熟悉基本的Transact-SQL语法即可瞬间无忧开码,大大降低了学习Expression2Sql的成本,甚至零成本。对象化操作,链式编程,支持多表...

    编译原理中间代码生成实验报告——完整版

    表达式中间代码生成 二、实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 三、实验内容 1. 构造算术表达式的四元式翻译文法 2. 设计算术表达式的递归下降子程序分析算法 3. 设计算术表达的四元式生成算法...

    System.Linq.Dynamic:这是用于.Net 4.0动态语言功能的Microsoft程序集

    动态分析字符串以生成表达式树,例如ParseLambda和Parse方法。 使用CreateType方法动态创建数据类。 有用的链接 您还可以咨询有关LINQ动态问题 贡献 您想帮我们吗? 您的捐款将直接帮助我们维护和发展ZZZ Free项目...

    c# 数据结构——二叉树——bool运算

    依次读取表达式并压入栈,直至获得右括号,从栈中弹出字符直至左括号,将弹出的表达式根据无括号表达式生成算法生成树结构,记下根节点;继续读取直至下一右括号,从栈中弹出字符直至左括号,将弹出的表达式根据无...

    tree-regex:生成解析树 (AST) 的线性正则表达式引擎

    生成解析树 (AST) 的快速正则表达式引擎。 它以匹配的文本大小的线性时间执行此操作,并以模式大小的 O(m*log(m)) 缩放。 算法 该算法描述于 尼科·施瓦茨。 可扩展的代码克隆检测。 博士论文,伯尔尼大学,2014 年...

    词法分析程序生成器实现将正则表达式、NFA、DFA、DFA最小化词法分析程序.zip

    - 将正则表达式转换为内部表示,如抽象语法树(AST)。 2. **NFA构建**: - 根据正则表达式的内部表示,构建对应的NFA。 - 实现NFA的状态和转换函数。 3. **DFA构建**: - 将NFA转换为等价的DFA。 - 实现DFA的...

    RecordParser:基于简单表达式树的解析器,专注于高性能,可扩展性和简单用法

    RecordParser-简单,快速,可扩展的记录解析RecordParser是基于表达式树的解析器,可帮助您编写可维护,快速且简单的解析器。通过自动化不相关的代码,开发人员可以更轻松地进行解析,从而使开发人员可以专注于映射...

    EF学习笔记

    EF的学习笔记,EF中 linq to sql 生成一个Queryable,Queryalbe所需要的参数是一颗表达式树……

    procyon:Procyon是一套Java元编程工具,包括一个丰富的反射API,一个用于运行时代码生成的LINQ风格的表达式树API和一个Java反编译器。

    Procyon是一套Java元编程工具,专注于代码生成和分析。 它包括以下库: 核心框架 编译器工具集(实验性) (实验性) Procyon库可从Maven Central的组ID org.bitbucket.mstrobel下org.bitbucket.mstrobel 。 核心...

    编译原理 将算术表达式转换成四元式的程序实现

    将算术表达式转换成四元式的程序实现

    C语言编译出错信息详解

    2.irrducible expression tree 不可约表达式树 这种错误是由于源文件中的某些表达式使得代码生成程序无法为它产生代码。这种表达式必须避免使用。 3.register allocation failure 存储器分配失效 这种错误指...

    正则表达式测试工具

    支持仅使用表达式里的选中部分进行匹配 支持树形和表格两种结果查看方式 选中树结点或单元格时自动选中源文本中对应的部分 表格内容可导出为csv文件(在表格模式下,右击结果,选择弹出菜单里的"导出(*.csv)") 支持拖入...

    PB动态查询

    主要用于灵活可靠地生成任意复杂的DataWindow的Filter语句或SQL的Select语句中的Where查询...在查询界面中,用户可以灵活地创建、销毁、组合或拆分这些对象,构造出复杂多样的表达式树,有效地实现了数据库的动态查询。

Global site tag (gtag.js) - Google Analytics