`
hojor
  • 浏览: 109193 次
  • 性别: 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#表达式树教程

    1. 动态SQL生成:通过表达式树解析C#查询,生成对应的SQL语句。 2. 自定义编译器或解释器:构建表达式树后,可以遍历并执行它们,实现自定义的代码执行逻辑。 3. AOP(面向切面编程):在方法调用前后插入自定义的...

    rpn.zip_rpn_表达式树c++

    在这个特定的项目“rpn.zip_rpn_表达式树c++”中,我们主要关注如何将中缀表达式(Infix Expression)转换为后缀表达式(Postfix Expression),并生成表达式树,最终在控制台上以图形化的方式展示出来。后缀表达式...

    回答问答和论坛的几个小程序,包括了表达式树代替反射的例子等

    与反射相比,表达式树的优势在于它能够保留原始代码的结构,更易于理解和优化,特别适合于动态生成和执行代码的场景。 例如,Q717701可能是一个使用表达式树来动态构建数据库查询的示例。在LINQ中,表达式树常被...

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

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

    表达式树 中缀表达式转后缀

    本文将详细讨论如何将中缀表达式转换为后缀表达式(也称为逆波兰表示法),并结合“表达式树”这一概念进行阐述。在这个过程中,我们将使用VC6.0作为开发环境,但它同样适用于其他编程语言和环境。 首先,我们了解...

    二叉表达式树

    二叉表达式树,也称为运算符树或语法树,是一种数据结构,它在计算机科学中用于表示数学或逻辑表达式。这种树形结构能够直观地展现表达式的运算顺序和结构,使得计算变得简单,同时也方便了编译器进行解析和优化。在...

    06.C# 知识回顾 - 表达式树 Expression Trees.pdf

    表达式树提供了一种在运行时动态操作代码的机制,允许程序在不需要事先编译的情况下,根据表达式树来生成对应的代码逻辑。这对于开发高度抽象和动态的框架和库是非常有用的,因为它可以让开发者以一种更为灵活的方式...

    CSharpSamples(数据结构、linq表达式树等)

    表达式树可以被编译器或运行时分析,以执行查询或者进行动态查询生成。 从压缩包的文件名列表来看,我们可以看到以下几个示例项目: 1. "LinqSamples\PasteXmlAsLinq\PasteXmlAsLinq.AddIn":这可能是一个将XML...

    LINQ与DLR的Expression tree(4):创建静态类型的LINQ表达式树节点

    通过学习这些内容,开发者能够更好地理解和利用表达式树,从而在LINQ查询、动态代码生成、元编程等领域发挥出强大的能力。对于那些希望深入了解.NET框架底层机制,或者想要提高代码灵活性和效率的开发人员来说,这是...

    lambda表达式与表达式树

    “lambda表达式与表达式树.ppt”可能是PPT演示文稿,深入讲解了lambda表达式和表达式树的概念、语法、优势,以及它们在实际项目中的应用实例。通过这个PPT,学习者可以更好地理解这两者的原理和用途。 “lambda...

    ExpressionTreeVisualize for vs2017

    在编译器设计中,解析器通常会生成表达式树,然后由代码生成器将其转换为目标代码。通过ExpressionTreeVisualize,开发者可以更容易地验证解析逻辑是否正确,并调试生成的表达式树。 在Visual Studio 2017中,这个...

    将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出

    然后,我们可以编写一个递归函数 `convert_to_infix_expression`,该函数将在遍历表达式树时生成中缀表达式。 在 `convert_to_infix_expression` 函数中,我们首先检查当前节点是否为空,如果为空则直接返回空字符...

    基于C++进行表达式树的建立和遍历(高级语言程序设计实验)

    完成以上步骤后,我们就能够根据给定的中缀表达式构建表达式树,并通过遍历生成中缀和后缀表达式。这个实验不仅锻炼了我们对C++语法的理解,还让我们深入掌握了数据结构和算法,尤其是树的构建与遍历,这对于理解和...

    C#基于表达式(Expression)实现对象深拷贝

    而使用表达式树可以更高效地创建深拷贝,因为它允许我们在运行时动态生成代码,避免了序列化的开销。 以下是一个基于表达式实现深拷贝的基本步骤: 1. **创建深拷贝辅助类**:定义一个静态类,如`DeepCopyHelper`...

    (源码)基于Java的数学表达式生成与计算系统.zip

    它通过构建二叉表达式树(Binary Expression Tree)来生成随机的数学表达式,并支持中序遍历生成表达式的中缀形式。系统还提供了表达式的计算功能,能够将生成的表达式及其计算结果写入文件,并支持用户提交答案与...

    c++clr处理的带界面的表达式计算

    这可能涉及到正则表达式来验证输入,以及使用编译器技术(如词法分析和语法分析)来生成表达式树。 6. **异常处理**: - 在计算过程中,可能会遇到无效的表达式、除以零或其他错误。因此,良好的异常处理机制是必...

Global site tag (gtag.js) - Google Analytics