数据结构之 表达式

 
#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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值