标签:linux c
二叉树
表达式树的树叶是操作数(operand),比如常数或变量,而其他的节点为操作符(operator)。这里限定操作符只能为+,-,*,/四个操作符。
把后缀表达式转变成表达式树:
程序:
//expression_tree.h
struct TreeNode;
typedef struct TreeNode *PtrToNode;
typedef PtrToNode Tree;
typedef char Type;
PtrToNode CreateNode(char ch);
struct TreeNode
{
Type Element;
Tree Left;
Tree Right;
};//expression_tree.c
#include "expression_tree.h"
#include<stdlib.h>
#include<stdio.h>
PtrToNode CreateNode(char ch)
{
PtrToNode p=malloc(sizeof(struct TreeNode));
if(p==NULL)
{
printf("The node is NULL !\n");
return p;
}
p->Element=ch;
return p;
}//stack.h
#include "expression_tree.h"
typedef Tree ElementType;
#ifndef _Stack_h
struct Node;
typedef struct Node *Stack;
int IsEmpty(Stack S);
int IsFull(Stack S);
Stack CreateStack( int MaxElements );
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push( ElementType X, Stack S);
ElementType Top( Stack S);
void Pop(Stack S);
ElementType TopAndPop( Stack S );
#define EmptyTOS (-1)
#define MinStackSize (5)
struct Node
{
int Capacity;
int TopOfStack;
ElementType *Array;
};
#endif//stack.c
#include "stack.h"
#include<stdio.h>
#include<error.h>
#include<stdlib.h>
int IsEmpty(Stack S)
{
return S->TopOfStack==EmptyTOS;
}
int IsFull(Stack S)
{
return S->TopOfStack==(S->Capacity-1);
}
Stack CreateStack( int MaxElements )
{
Stack S;
if(MaxElements<MinStackSize)
error(1,1,"Stack size is too small");
S=malloc(sizeof(struct Node));
if(S==NULL)
error(1,1,"Out of space!!!");
S->Array=malloc(sizeof(ElementType)*MaxElements);
if(S->Array==NULL)
error(1,1,"Out of space!!!");
S->Capacity=MaxElements;
MakeEmpty(S);
return S;
}
void DisposeStack(Stack S)
{
if(S!=NULL)
{
free(S->Array);
free(S);
}
}
void MakeEmpty(Stack S)
{
S->TopOfStack=EmptyTOS;
}
void Push(ElementType X,Stack S)
{
if(IsFull(S))
error(1,1,"Full stack");
else
{
S->TopOfStack++;
S->Array[S->TopOfStack]=X;
}
}
ElementType Top( Stack S)
{
if(!IsEmpty(S))
return S->Array[S->TopOfStack];
error(1,1,"Empty stack 3");
return 0;
}
void Pop( Stack S)
{
if(IsEmpty(S))
error(1,1,"Empty stack 2");
else
S->TopOfStack--;
}
ElementType TopAndPop( Stack S)
{
if(!IsEmpty(S))
{
return S->Array[ S->TopOfStack--];
}
error(1,1,"Empty stack 1");
return 0;
}//MainProgram.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"stack.h"
Tree CreateTree(char* str)
{
Tree T,p,q;
int len=strlen(str);
Stack S=CreateStack(len);
int i;
for(i=0;i<len;++i)
{
switch(str[i])
{
case ‘+‘:
case ‘-‘:
case ‘*‘:
case ‘/‘:
{
T=CreateNode(str[i]);
p=TopAndPop(S);
q=TopAndPop(S);
T->Left=q;
T->Right=p;
Push(T,S);
break;
}
default:
{
T=CreateNode(str[i]);
Push(T,S);
break;
}
}
}
return Top(S);
}
void outtree(Tree t)
{
if(t!=NULL)
{
outtree(t->Left);
outtree(t->Right);
printf("%c",t->Element);
}
}
int main()
{
char* ss="ab+cde+**";
Tree TT=CreateTree(ss);
outtree(TT);
printf("\n");
return 0;
}利用后缀表达式构造一个表达式树,然后以后序遍历策略输出该树:
标签:linux c
原文地址:http://yuzwei.blog.51cto.com/10126623/1685455