大家可能看见程序内容有很多,其实大家不要慌张,主要分为三个部分
- 堆栈的基础内容实现(创建堆栈\释放堆栈\入栈出栈
- 二叉树的基础内容实现(二叉树的合并/二叉树的遍历/二叉树释放)
- 主程序测试
//
//先把表达树给我吃掉!
#include<stdio.h>
#include<stdlib.h>
typedef char ElementTypeT;
struct BTreeNode
{
ElementTypeT element;
struct BTreeNode * left;
struct BTreeNode *right;
};
typedef struct BTreeNode *ptrNode;
typedef ptrNode BTree;
ptrNode createNode(ElementTypeT e);
BTree addTree(BTree bt1,BTree bt2);
void disposeTree(BTree bt);//回收树,遍历着把树给free
void inorder(BTree bt);
void postorder(BTree bt);
void preorder(BTree bt);
//下面先把树的简单功能实现,很显然这里肯定要用到两种数据结构
//一种是堆栈,一种是树,所以代码不会很短!
ptrNode createNode(ElementTypeT e)
{
ptrNode bt = (ptrNode)malloc(sizeof(struct BTreeNode));
if(bt==NULL)
return NULL;//友好一下
bt->element = e;
bt->right = NULL;
bt->left = NULL;
return bt;
}
BTree addTree(BTree bt1,BTree bt2)
{
if(bt1==NULL)
bt1=bt2;
else if(!bt1->right)
bt1->right=bt2;
else
bt1->left = bt2;
return bt1;//同学们看到这行代码会发现,他只是做简单的树合并!
}
void disposeTree(BTree bt)
{
if(bt==NULL)
return ;//友好一下
disposeTree(bt->left);
disposeTree(bt->right);
free(bt);
}
void inorder(BTree bt)
{
if(bt==NULL)
return ;
inorder(bt->left);
printf("%c ",bt->element);
inorder(bt->right);
}
//基础的三种树遍历!
typedef BTree ElementType;
typedef struct Node* PtrToNode;
typedef PtrToNode Stack;
struct Node{
ElementType data;
PtrToNode next;
};
Stack createStack();//创建堆栈
void makeEmpty(Stack);
void dispose(Stack);
void push(ElementType,Stack);//入栈
ElementType pop(Stack);//出栈
//堆栈细节
Stack createStack()
{
Stack s;
s = (Stack)malloc(sizeof(struct Node));
if(s==NULL)
return NULL;//友好一下
s->next = NULL;
makeEmpty(s);
return s;
}
void makeEmpty(Stack s)
{
if(s==NULL)
return ;//友好一下
while((s->next)!=NULL)
pop(s);//将栈里元素全部弹出
}
void dispose(Stack s)
{
if(s==NULL)
return ;//友好一下
makeEmpty(s);
free(s);
}
void push(ElementType e,Stack s)
{
Stack node = (Stack)malloc(sizeof(struct Node));
if(node ==NULL)
return ;//友好一下
node->data = e;
node->next = s->next;
s->next = node;
}
ElementType pop(Stack s)
{
if(s->next!=NULL)
{
Stack node = s->next;
ElementType e = node->data;
s->next = node->next;
free(node);
return e;
}
return NULL;
}
int main()
{
char postfix[30]="ab+cde+**";
Stack s = createStack();
BTree a,b,bt,letter;
int i = 0;
while(postfix[i]!='\0')
{
char c = postfix[i];
switch(c)
{
case'+':
case'-':
case'*':
case'/':
a = pop(s);
b = pop(s);
bt = createNode(c);
bt = addTree(bt,a);
bt = addTree(bt,b);
push(bt,s);
break;
default:
letter = createNode(c);
push(letter,s);
}
i++;
}
BTree expre_tree = pop(s);
printf("zhong xu:\n");
inorder(expre_tree);
disposeTree(expre_tree);//把屁股搽干净,溜了!
dispose(s);
return 0;
printf("\n");
}