#include<stdio.h>
#include<stack>
using namespace std;
typedef struct TNode{
char data;
struct TNode *left, *right;
}TNode, *BTree;
void preorder(BTree T){
if(T){
printf("%c", T->data);
preorder(T->left);
preorder(T->right);
}
}
void inorder(BTree T){
if(T){
inorder(T->left);
printf("%c", T->data);
inorder(T->right);
}
}
void postorder(BTree T){
if(T){
postorder(T->left);
postorder(T->right);
printf("%c", T->data);
}
}
void createPost(BTree &T, char *post);
int eval(BTree T);
int main(){
BTree T = NULL;
char post[80];
scanf("%s", post);
createPost(T, post);
preorder(T); printf("\n");
inorder(T); printf("\n");
postorder(T); printf("\n");
printf("%d\n",eval(T));
}
void createPost(BTree &T, char *post){
BTree t;
stack<BTree> s;
for(char *str=post;*str!='\0';str++)
{
if (*str>='0'&&*str<='9')
{
T=new TNode;
T->data=*str;
T->left=NULL;
T->right=NULL;
s.push(T);
}
else
{
T=new TNode;
T->data=*str;
T->right=s.top();s.pop();
T->left=s.top();s.pop();
s.push(T);
}
}
}
int eval(BTree T){
if(T==NULL) return NULL;
else if(T->data>='0'&&T->data<='9') return (T->data-'0');
//数则是叶,无需再次递归
else switch(T->data){//遇到操作符继续递归
case '+':
return eval(T->left)+eval(T->right);break;
case '-':
return eval(T->left)-eval(T->right);break;
case '*':
return eval(T->left)*eval(T->right);break;
case '/':
return eval(T->left)/eval(T->right);break;
}
}
C语言 表达式树的创建与查找
最新推荐文章于 2024-05-20 23:00:09 发布