#include < stdio.h > #include < string .h > #include < iostream.h > #include < stdlib.h > #define DT true #define OP false #define BIGGER 1 #define EQUAL 0 #define SMALLER -1 #define oope(msg) {perror(msg);exit(-1);} typedef struct express ... { int data; char oper; bool type; express *left,*right;} kk; class Express ... {private: express *head; express * creat(char,int); //产生一棵树,根为操作符,左孩子为数值 express * creat(char); //产生一个节点 express * creat(int); //产生一个节点 int inline getData(char *,int *); int inline compress(char,char); void inline show(express *); void preOrder(express *); void inOrder(express *); void postOrder(express *);public: Express(); express * init(char *); void preOrder(void); void inOrder(void); void postOrder(void);} ;Express::Express() ... { head=NULL;} void Express::show(express * ex) ... { if(ex->type==OP) cout<<ex->oper<<" "; else cout<<ex->data<<" ";} void Express::inOrder() ... { cout<<"inorder:"<<endl; inOrder(head); cout<<endl;} void Express::preOrder() ... { cout<<"preorder:"<<endl; preOrder(head); cout<<endl;} void Express::postOrder() ... { cout<<"postorder:"<<endl; postOrder(head); cout<<endl;} void Express::preOrder(express * ex) ... { if(ex)...{ show(ex); preOrder(ex->left); preOrder(ex->right); }} void Express::postOrder(express * ex) ... { if(ex)...{ postOrder(ex->left); postOrder(ex->right); show(ex); }} void Express::inOrder(express * ex) ... { if(ex)...{ inOrder(ex->left); show(ex); inOrder(ex->right); }} int inline Express::getData( char * ch, int * loc) ... { char buf[7]; int len=0; for(;ch[*loc]>='0' && ch[*loc]<='9';(*loc)++)...{ buf[len++]=ch[*loc]; } buf[len]=0; return atoi(buf);} int inline Express::compress( char x, char y) ... { if(x=='+' || x=='-')...{ if(y=='+' || y=='-') return EQUAL; else return SMALLER; } else...{ if(y=='+' || y=='-') return BIGGER; else return EQUAL; }} express * Express::creat( char op) ... { express * tmp; tmp=new express; tmp->oper=op; tmp->type=OP; tmp->left=tmp->right=NULL; return tmp;} express * Express::creat( int dt) ... { express * tmp; tmp=new express; tmp->data=dt; tmp->type=DT; tmp->left=tmp->right=NULL; return tmp;} express * Express::creat( char op, int dt) ... { express *tmp; tmp=creat(op); tmp->left=creat(dt); return tmp;} express * Express::init( char * ch) ... { express *bef,*aft; int loc=0,dt; char op; dt=getData(ch,&loc); op=ch[loc++]; bef=head=creat(op,dt); while(ch[loc]!=0)...{ dt=getData(ch,&loc); if(ch[loc]==0) ...{ bef->right=creat(dt);break;} op=ch[loc++]; aft=creat(op,dt); if(compress(aft->oper,bef->oper)!=SMALLER)...{ bef->right=aft; bef=aft; } else...{ bef->right=aft->left; aft->left=head; bef=head=aft; } } return head;} void main() ... { Express ex; char *data="1+2+3/4*3+3+33-5"; ex.init(data); ex.inOrder(); ex.preOrder(); ex.postOrder();}