第四章第一小节(表达式树的构造)

利用栈来构造表达式树,注输入的表达式为后缀表达式

// stack.h中的内容
//树的结构,函数已在stack.c中实现
typedef struct treeNode* tPtrNode;
typedef tPtrNode Tree;
struct treeNode {
	char data;
	tPtrNode left;
	tPtrNode right;
};
//链表实现栈
typedef tPtrNode element;
typedef struct Node* PtrNode;
typedef PtrNode stack;

//函数声明
int IsEmpty(stack S); //判断栈是否为空
stack createStack(); //创建空栈
void makeEmpty(stack S); // 删除栈
stack disposeStack(stack S);	//销毁栈
void push(element x, stack S); //入栈
void pop(stack S); //出栈
element top(stack S); //返回栈顶的元素值
element topAndPop(stack S);	//返回栈顶的元素值,并出栈
struct Node {
	element data;
	PtrNode next;
};
//主函数中树的构造
#include<iostream>
#include"Stack.h"
using namespace std;
//表达式树的构造

int main() {
	char str[20];	//存放后缀表达式
	int i = 0;
	stack S = createStack();	//创建栈
	scanf_s("%s", str, 20);	
	while (str[i] != '\0') {	//当栈中只有一个节点的时候,树已经构造完成,该节点就是树根;
		if (str[i] >= '0' && str[i] <= '9')
		{	//创建树节点,入栈
			tPtrNode t = (tPtrNode)malloc(sizeof(struct treeNode));
			t->data = str[i];
			t->left = t->right = NULL;
			push(t, S);
		}
		else if (str[i] == '-')
		{	//取出两个树节点,构造一个子树,入栈
			tPtrNode m = topAndPop(S);
			tPtrNode n = topAndPop(S);
			tPtrNode r = (tPtrNode)malloc(sizeof(struct treeNode));
			r->left = m;
			r->right = n;
			r->data = '-';
			push(r, S);
		}
		else if (str[i] == '+')
		{
			tPtrNode m = topAndPop(S);
			tPtrNode n = topAndPop(S);
			tPtrNode r = (tPtrNode)malloc(sizeof(struct treeNode));
			r->left = m;
			r->right = n;
			r->data = '+';
			push(r, S);
		}
		else if (str[i] == '/')
		{
			tPtrNode m = topAndPop(S);
			tPtrNode n = topAndPop(S);
			tPtrNode r = (tPtrNode)malloc(sizeof(struct treeNode));
			r->left = m;
			r->right = n;
			r->data = '/';
			push(r, S);
		}
		else if (str[i] == '*')
		{
			tPtrNode m = topAndPop(S);
			tPtrNode n = topAndPop(S);
			tPtrNode r = (tPtrNode)malloc(sizeof(struct treeNode));
			r->left = m;
			r->right = n;
			r->data = '*';
			push(r, S);
		}
		i++;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值