利用二叉树解决表达式

看STL源码解析,突然想写一个编译器表达式树,写了一个晚上,只写完了解释树(杯具啊..),不过树既然写出来了,解析应该比较容易,不多解释了,看代码

typedef struct node_
{
 int value;
 node_* leftChild;
 node_* rightChild;
 node_* parent;
 ntype type;
 node_():rightChild(0),leftChild(0),parent(0),type(sign){};
}tree_node;

 

tree_node* CArithTree::Input(char* &cdata)
{
 if(cdata)
 {
  int nlen = strlen(cdata);
  tree_node* numberNdLeft = 0;
  tree_node* numberNdRight = 0;
  tree_node* psubRoot = 0;

  while(*cdata)
  {
   switch(*cdata)
   {
   case '(':{
    if(psubRoot)
    {
     psubRoot->leftChild = numberNdLeft;
     psubRoot->rightChild = (numberNdRight = Input(++cdata));
     numberNdLeft->parent = numberNdRight->parent = psubRoot;
     numberNdLeft = psubRoot;
     numberNdRight = 0;
     psubRoot=0;
     //return psubRoot;
    }
    else
     ++cdata;
      }break;

   case ')':{
     ++cdata;
      return numberNdLeft;
      }break;

   case '+':case '-':case '*':case '/':{
    psubRoot = new tree_node;
    psubRoot->value = *cdata;
    ++cdata;
      }break;

   default:
    {
     if(!psubRoot)
     {
      numberNdLeft = new tree_node;
      numberNdLeft->value = getnumbers(cdata);
      numberNdLeft->type = leaf;
      if(!numberNdLeft->value)
       return false;
     }
     else
     {
      numberNdRight = new tree_node;
      numberNdRight->value = getnumbers(cdata);
      numberNdRight->type = leaf;
      if(!numberNdRight->value)
       return false;

      psubRoot->leftChild = numberNdLeft;
      psubRoot->rightChild = numberNdRight;
      numberNdLeft->parent = numberNdRight->parent = psubRoot;
      numberNdLeft = psubRoot;
      numberNdRight = 0;
      psubRoot=0;
     }
    }
   }
  }

  return numberNdLeft;
 }

 return 0;
}

 

 

后面补上解析代码:

int CArithTree::parse(tree_node* Root)
{
  int nleftValue = 0, nrightValue = 0;
  if(Root)
  {
   Root = Root->leftChild;
   switch(Root->type )
   {
   case leaf:nleftValue = Root->value;break;
   case sign:nleftValue = parse(Root);break;
   default:return 0 ;break;
   }

   Root = Root->parent;
   char nSign = (char)Root->value;
   Root = Root->rightChild;

   if(sign == Root->type)
    nrightValue = parse(Root);
   else if(leaf == Root->type)
    nrightValue = Root->value;
   else
    return 0;

    switch(nSign)
   {
   case '+':return nleftValue+nrightValue;break;
   case '-':return nleftValue-nrightValue;break;
   case '*':return nleftValue*nrightValue;break;
   case '/':return nleftValue/nrightValue;break;
   default:return 0;
   }
  }
  return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值