利用栈来构造表达式树,注输入的表达式为后缀表达式
// 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;
}