输入波兰表达式,并创建二叉树
tree* creat(tree *T)
{
char data;
if(x>'0'&&i<2)//如果根节点为数字时,将它的左右孩子为空
{
i++;
return NULL;
}
scanf("%c",&data);
getchar();
x=data;//储存根节点的数据
i=0;
T=(tree*)malloc(sizeof(tree));
T->data=data;
T->lchild=creat(T->lchild);
T->rchild=creat(T->rchild);
return T;
}
根据波兰表达式计算
void count(tree *p)
{
int i=0;
stack *s;
tree *T=p;
s=(stack*)malloc(sizeof(stack));
s->top=-1;//初始化栈
push(s,T);
while(!empty(p))
{
push(s,T);
while(T->lchild)
{
T=T->lchild;
push(s,T);
}
pop(s);
T=pop(s);
if(empty(s))
{
T=p;
i=1;
}
switch(T->data)
{
case '+':
T->data=(T->lchild->data-'0')+(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0';
break;
case '-':
T->data=(T->lchild->data-'0')-(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0';
break;
case '*':
T->data=(T->lchild->data-'0')*(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0';
break;
case '/':
T->data=(T->lchild->data-'0')/(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0';
break;
default:
break;
}
if(!empty(s))
{
T=pop(s);
if(T->rchild)
{
T=T->rchild;
}
}
if(i==1)
{
return;
}
}
}
以下为全部代码
#include#include #define maxsize 20 char x=0; int i=0; typedef struct tree { char data; struct tree *lchild; struct tree *rchild; }tree; typedef struct { tree *data[maxsize]; int top; }stack; tree* creat(tree *T) { char data; if(x>'0'&&i<2) { i++; return NULL; } scanf("%c",&data); getchar(); x=data; i=0; T=(tree*)malloc(sizeof(tree)); T->data=data; T->lchild=creat(T->lchild); T->rchild=creat(T->rchild); return T; } /栈的操作 void push(stack *s,tree *e) { if(s->top>=maxsize) { return; } else { s->top++; s->data[s->top]=e; } } tree* pop(stack *s) { tree *r; if(s->top==-1) { return; } else { r=s->data[s->top]; s->top--; } return r; } int empty(stack *s) { if(s->top==-1) return 1; else return 0; } int count(tree *p) { int i=0; stack *s; tree *T=p; s=(stack*)malloc(sizeof(stack)); s->top=-1;//初始化栈 push(s,T); while(!empty(p)) { push(s,T); while(T->lchild) { T=T->lchild; push(s,T); } pop(s); T=pop(s); if(empty(s)) { T=p; i=1; } switch(T->data) { case '+': T->data=(T->lchild->data-'0')+(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0'; break; case '-': T->data=(T->lchild->data-'0')-(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0'; break; case '*': T->data=(T->lchild->data-'0')*(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0'; break; case '/': T->data=(T->lchild->data-'0')/(T->rchild->data-'0');T->lchild=T->rchild=NULL;T->data=T->data+'0'; break; default: break; } if(!empty(s)) { T=pop(s); if(T->rchild) { T=T->rchild; } } if(i==1) { return; } } } void show1(tree *T) { if(T==NULL) { return; } printf("%c",T->data); show1(T->lchild); show1(T->rchild); } int main() { tree *t; t=creat(t); show1(t); printf("n"); count(t); printf("%c",t->data); return 0; }
样例:



