[C语言](堆栈+二叉树)表达式树实现(含测试案例)

大家可能看见程序内容有很多,其实大家不要慌张,主要分为三个部分

  • 堆栈的基础内容实现(创建堆栈\释放堆栈\入栈出栈
  • 二叉树的基础内容实现(二叉树的合并/二叉树的遍历/二叉树释放)
  • 主程序测试
//
//先把表达树给我吃掉!
#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");
}

代码参考来源是这位大佬的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值