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

#include
#include
#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<<"请输入算术表达式,并以#结束,中间计算过程要是个位数."<    BiTree T;
   InitExpTree(T);          //创建表达式树
   cout<  }
    

利用二叉树求解表达式的值_第1张图片

你可能感兴趣的:(c++,算法,开发语言)