利用二叉树求解表达式的值

#include<iostream>
#include<string>
#define ERROR -1
#define MAXSIZE 100
using namespace std;

typedef struct BiTNode{                             //二叉树的二叉链表存储表示
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{                  // 字符栈定义
    char *base;
    char *top;
    int stacksize;
}SqStack;

typedef struct{                   //树栈定义
    BiTree *base;
    BiTree *top;
    int stacksize;
}BiTreeStack;


void  InitStack(SqStack &S){             //字符栈初始化
    S.base=new char[MAXSIZE];
    if(!S.base) exit(-1);
    S.top=S.base;
    S.stacksize=MAXSIZE;
}


void  InitBiTreeStack(BiTreeStack &S){             //树栈初始化
    S.base=new BiTree[MAXSIZE];
    if(!S.base) 
        exit(-1);
    S.top=S.base;
    S.stacksize=MAXSIZE;

}
    //待补充


void Push(SqStack &S,char e)             //字符栈入栈
{
    if(S.top-S.base==S.stacksize)
        return;
    *S.top=e;
    S.top++;


    //待补充
}
void PushBiTree(BiTreeStack &S,BiTree e)             //树栈入栈
{
    if(S.top-S.base==S.stacksize)
        return;
    *S.top=e;
    S.top++;

    //待补充

}
void Pop(SqStack &S,char &e)           //字符栈出栈
{
    if(S.top==S.base)
        return;
    e=*--S.top;     

    //待补充
}

void PopBiTree(BiTreeStack &S,BiTree &e)           //树栈出栈
{
    if(S.top==S.base)
        return;
    e=*--S.top;     

    //待补充
     
}


char GetTop(SqStack &S)                //字符栈得到栈顶函数
{        
    if(S.top==S.base)    exit(1);
    return *(S.top-1);
}

char Precede(char t1,char t2) 
 { /* 根据教科书表3.1,判断两符号的优先关系 */
   char f;
    switch(t2)
   {
     case '+':if(t1=='('||t1=='#')
                f='<';
              else
                f='>';
              break;
     case '-':if(t1=='('||t1=='#')
                f='<';
              else
                f='>';
              break;
     case '*':if(t1=='*'||t1=='/'||t1==')')
                f='>';
              else
                f='<';
              break;
    case '/':if(t1=='*'||t1=='/'||t1==')')
                f='>';
              else
                f='<';
              break;
    case '(':if(t1!=')')
                f='<';
              break;
    case')':if(t1=='(')
                f='=';
                else
                    f='>';
                break;
    case'#':if(t1=='#')
                f='=';
        else
            f='>';
   }

   return f;
 }
int In(char c) 
 { /* 判断c是否为运算符 */
   switch(c)
   {
   case '+':
   case'-':
   case'*':
    case '/':
   case'#':
   case '(':
   case')':return 1;break;
   default:return 0;
   }
 }
int GetValue(char theta,int a,int b)     //进行运算的函数
 {
    int c;
    switch(theta)
    {
    case '+':c=a+b;break;
    case'-':c=a-b;break;
    case'*':c=a*b;break;
    case'/':c=a/b;break;
    default:
        break;
    }
    return c;
 }

void CreateExpTree(BiTree &T,BiTree a,BiTree b,char ch){           //简单二叉树的创建
    T=new BiTNode;
    T->data=ch;
    T->lchild=a;
    T->rchild=b;
}


 void InitExpTree(BiTree &T)      //算法5.12 表达式树的创建
 {    
     SqStack OPTR;
    BiTreeStack EXPT;
    char ch,theta,x;
 BiTree a,b;
 InitStack(OPTR);Push(OPTR,'#');

    InitBiTreeStack(EXPT);cin>>ch;
    while(ch!='#'||GetTop(OPTR)!='#'){
    if(!In(ch)){CreateExpTree(T,NULL,NULL,ch);PushBiTree(EXPT,T);cin>>ch;}//*q


else
   switch(Precede(GetTop(OPTR),ch)){
   case'<':
    Push(OPTR,ch);cin>>ch;
    break;
   case'>':
    Pop(OPTR,theta);
    PopBiTree(EXPT,b);PopBiTree(EXPT,a);
    CreateExpTree(T,a,b,theta);    //*
    PushBiTree(EXPT,T);
    break;
   case'=':
    Pop(OPTR,x);cin>>ch;
    break;
  }
 
 }
 
   //待补充
}


 int EvaluateExTree(BiTree T){ //算法5.13 表达式树的求值
int lvalue,rvalue;
 lvalue=rvalue=0;
 if(T->lchild==NULL&&T->rchild==NULL)
  return T->data-'0';
 else{
 lvalue=EvaluateExTree(T->lchild);
  rvalue=EvaluateExTree(T->rchild);
  return GetValue(T->data,lvalue,rvalue);
 }


    //待补充
 }

 void main() 
 {
   cout<<"请输入算术表达式,并以#结束,中间计算过程要是个位数."<<endl;
   BiTree T;
   InitExpTree(T);          //创建表达式树
   cout<<EvaluateExTree(T)<<endl;             //输出值
 }
    

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值