`
sylinx_yqg
  • 浏览: 140617 次
  • 性别: Icon_minigender_1
  • 来自: 福建 漳州
社区版块
存档分类
最新评论

表达式树的构造算法

阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
/************************************************************************** 文件名:treeexpression.c** 文件描述:本程序给出表达式树的构造算法*           在turboc 2.0 调试通过,注意只能输入个位数,且没有加上*           对括号的处理,读者可以自己将其加上去* 创建人: 颜清国   2006年5月4日* 说明: *************************************************************************/#include "stdio.h"#include "string.h"#include "stdlib.h"#include "conio.h"#define MAX 20#define MAXS 100/********************************** 用来求后缀表达式的栈************************************/typedef struct sstack{	char str[MAXS];	int top;}stack;/************************************** 定义树的结构体***************************************/typedef struct tagtree{ char data;                /*数据域*/ int flag;                 /*非递归操作时用来做标志*/ struct tagtree*lchild;    /*指向左孩子的指针域*/ struct tagtree*rchild;    /*指向右孩子的指针域*/}tree;/*入栈操作*/void push(stack *ta,char p){	ta->top++;	ta->str[ta->top]=p;}/*出栈,返回栈顶的值*/char pop(stack *ta){	char temp;	if(ta->top==-1)/*栈已经空*/	{		printf("stack is empty!");		return 0;	}	else	{		temp=ta->str[ta->top];		ta->top--;	}	return temp;}/******************************将中缀表达式转化为后缀表达式*******************************/  void trans(char mid[],char last[]){	stack temp;          /*临时栈,用来调整成后缀表达式*/	int lm=0,la=0,len=strlen(mid);	temp.top=-1;           /*初始栈为空*/	push(&temp,'(');    /*整个表达式要加上括号*/	while(lm < len)	{		switch(mid[lm])		{		case '-':    /*'+''-'转化时,'('前的OP均出栈*/		case '+':       /*注意必须先将整个表达式要加上括号*/			while(temp.str[temp.top]!='(')			{				last[la++]=pop(&temp);			}			push(&temp,mid[lm]);/*自己入栈*/			break;		case '*':		case '/':			while((temp.str[temp.top]=='*') 				||(temp.str[temp.top]=='/'))			{				last[la++]=pop(&temp);/*栈顶是'*','/'则出栈*/			}			push(&temp,mid[lm]); /*自己入栈*/			break;		case '(':			push(&temp,'('); /*是'('直接入栈*/			break;		case ')':			while(temp.str[temp.top]!='(')			{				last[la++]=pop(&temp); /*将'('前所有OP出栈*/			}			pop(&temp); /*将'('出栈,自己不入栈*/			break;     		default:			if((mid[lm] >= '0')&&(mid[lm] <= '9'))/*可以屏蔽其它字符*/			{				while((mid[lm] >='0')&&(mid[lm] <= '9'))				{					last[la++]=mid[lm++]; /*是数字保存到字串中*/				}				lm--;            /*需要退回来*/			}			break;		}		lm++;                       /*依次扫描待转换的字串*/	}	while(temp.top > 0)                /*第0个元素为'(',不用保存*/	{		last[la++]=pop(&temp);	}	last[la]='\0';   /*标志后缀表达式结束*/}/**************************************** 根据后缀和中缀表达式构造二叉树*****************************************/tree*PostCreateTree(char *post,char *mid,int n){ tree*root=NULL; int lp=0; if(n==0) return NULL; while(lp<n root-="" root="(tree*)malloc(sizeof(tree));"></n>data = post[n-1]; /*printf("\n%c",root->data); getch();*/ root->lchild = PostCreateTree(post,mid,lp); root->rchild = PostCreateTree(post+lp,mid+lp+1,n-lp-1); return root;}/************************************************ 用树形表示法输出树*************************************************/void DispTree(tree *root,int x,int y,int n)     /*n用来控制第一层树的高度*/{ int i=0; if(root !=NULL)  {    gotoxy(x,y);                               /*到相应结点输出*/    printf("%c",root->data);    if(root->lchild != NULL)                  /*处理左子树,这里只有第一次N为可变的,*/    {       i=1;                                   /*为的是能够输出整棵树,而不会被覆盖,*/       while(ilchild,x-n,y+n,2);       /*递归处理左子树*/     }     if(root->rchild != NULL)    {       i=1;       while(irchild,x+n,y+n,2);       /*递归处理右子树*/     }   }}void main(){	char mid[100],post[100];        tree *root;        printf("Please input the expression: ");	gets(mid);	trans(mid,post);        root=PostCreateTree(post,mid,strlen(mid));        printf("\nthe ruselt is:");        DispTree(root,10,4,5);	getch();}     


分享到:
评论

相关推荐

    构造正则表达式的简化DFA算法

    造带E动作的有限自动机的操作, 然后用状态树构造与该NFA 等价的简化DFA. 这 个算法在计算机上已实现, 并且对输入的任意正则表达式, 都可以输出等价于正则 表达式的简化DFA. 该算法可以用于某些离散信息处理系统的...

    数据结构与算法实验报告

    2.3.6 栈的应用——四则运算表达式求值 10 3 实验三 二叉树的构造与遍历 13 3.1 实验目的 13 3.2 实验要求 13 3.3 实验内容 13 3.3.1 二叉树结构体的构造 13 3.3.2 二叉树的节点产生 13 3.3.3 二叉树的前序遍历 14 ...

    Regex-tree:将正则表达式表示为树而不是构造有限自动机的正则表达式匹配算法的 Java 实现

    正则表达式树 我还没有为它编写测试(还),所以很可能存在错误。 我正在考虑通过使用树而不是构建 NFA/DFA 来进行正则表达式匹配的方法,并遇到了. 这是博客中描述的算法的实现,并进行了一些小调整。 树的构造...

    将逆波兰式转换成波兰式表达式

    这是严蔚敏《数据结构》配套习题册上的题目:将逆波兰式转换成波兰式,并提示错误(作为简化,只处理"+-*/"和0~9的数字)。... 算法是根据后根遍历的序列构造一个表达式树,进而先根遍历此树获得波兰式表达式。

    论文研究-一种新型的GEP算法及应用研究.pdf

    提出一种适合于GEP表达式树构造的新方法,以及相应的新解码方法(GPED)。通过实验对比,GPED可大大缩短演化时间。提出一种新的算法GPEP,将GPEP应用于碎石桩复合地基承载力预测,结果表明GPEP算法在预测精度和演化...

    用于符号回归问题的改进的基因表达编程方法

    (2)如果某些特殊的复杂问题需要,则为新的评估单个方法提供相应的表达式树构造方案; (3)一种处理数值常数的新方法,以提高收敛性。 本文对我们提出的S_GEP方法与原始GEP以及其他方法进行了全面的比较研究。 ...

    数据结构与算法分析

     4.2.2 一个例子——表达式树   4.3 查找树ADT——二叉查找树   4.3.1 contains   4.3.2 findMin和findMax   4.3.3 insert   4.3.4 remove   4.3.5 析构函数和复制赋值操作符   4.3.6...

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    5.5.2 赫夫曼树的构造算法 118 5.5.3 赫夫曼编码 121 5.6 小结 123 习题 123 第6章 图 126 6.1 图的定义和基本术语 126 6.1.1 图的定义 126 6.1.2 图的基本术语 128 6.2 图的存储结构 129 6.2.1 ...

    数据结构与算法分析_Java语言描述(第2版)

    4.2.2 例子:表达式树 4.3 查找树ADT——二叉查找树 4.3.1 contains方法 4.3.2 findMin方法和findMax方法 4.3.3 insert方法 4.3.4 remove方法 4.3.5 平均情况分析 4.4 AVL树 4.4.1 单旋转 4.4.2 双旋转 4.5 伸展树...

    算法-第4版-完整版

    5.4.6 构造与正则表达式对应的 5.5 数据压缩 529 5.5.1 游戏规则 529 5.5.2 读写二进制数据 530 5.5.3 局限 533 5.5.4 热身运动:基因组 534 5.5.5 游程编码 537 5.5.6 霍夫曼压缩 540 第6章...

    《算法》中文版,Robert Sedgewick,塞奇威克

    编辑推荐  Sedgewick之巨著,与...5.4.6 构造与正则表达式对应的 5.5 数据压缩 5.5.1 游戏规则 5.5.2 读写二进制数据 5.5.3 局限 5.5.4 热身运动:基因组 5.5.5 游程编码 5.5.6 霍夫曼压缩 第6章 背景 索引

    算法 第4版 高清中文版

    5.4.6 构造与正则表达式对应的 5.5 数据压缩 529 5.5.1 游戏规则 529 5.5.2 读写二进制数据 530 5.5.3 局限 533 5.5.4 热身运动:基因组 534 5.5.5 游程编码 537 5.5.6 霍夫曼压缩 540 第6章 背景 558 索引 ...

    ACM算法模板和pku代码

    算法优先算法求表达式的值 词法分析与算法优先算法,集合运算:差集,并集,交集 矩阵乘法 线段覆盖数量 矩阵构造,nlogn矩阵乘法 2-SAT XOR AND OR 变量逻辑表达式可满足性 钥匙开门,二分+2-SAT判定 枚举 两...

    数据结构与算法分析_Java语言描述(第2版)]

    树4.1 预备知识4.1.1 树的实现4.1.2 树的遍历及应用4.2 二叉树4.2.1 实现4.2.2 例子:表达式树4.3 查找树ADT——二叉查找树4.3.1 contains方法4.3.2 findMin方法和findMax方法4.3.3 insert方法4.3.4 remove方法...

    算法 第4版-谢路云译-带完整书签

    5.4.6 构造与正则表达式对应的NFA 522 5.5 数据压缩 529 5.5.1 游戏规则 529 5.5.2 读写二进制数据 530 5.5.3 局限 533 5.5.4 热身运动:基因组 534 5.5.5 游程编码 537 5.5.6 霍夫曼压缩 540 第6章...

    C语言版数据结构与算法分析-严蔚敏经典视频教程

    09-007键树的结构特点、哈希表的定义、哈希表的构造方法 09-008哈希表的查找与删除操作、处理冲突的方法 10-001排序的定义、直接插入排序、冒泡排序、快速排序 10-002堆排序、多关键字的排序、基数排序、排序时间...

    编译原理语法分析.zip

    (1) 编程实现算法4.2,为给定文法自动构造预测分析表。 (2) 编程实现算法4.1,构造LL(1)预测分析程序 。 方法3:编写语法分析程序实现自底向上的分析,要求如下。(必做) (1) 构造识别该文法所有活前缀的DFA...

    科技大学 编译原理 华保健 全86讲

    3.2.1 NFA转换成DFA:子集构造算法1.flv 3.2.2 NFA转换成DFA:子集构造算法2.flv 3.2.3 NFA转换成DFA:子集构造算法3.flv 3.2.4 NFA转换成DFA:子集构造算法4.flv 3.3.1 DFA的最小化:Hopcroft算法1.flv 3.3.2...

    数据结构与算法分析C描述第三版

     4.2.2 一个例子——表达式树   4.3 查找树ADT——二叉查找树   4.3.1 contains   4.3.2 findMin和findMax   4.3.3 insert   4.3.4 remove   4.3.5 析构函数和复制赋值操作符   4.3.6 平均...

Global site tag (gtag.js) - Google Analytics