算法5.12-5.13表达式求值

本文介绍了一种使用二叉树数据结构来解析并计算算术表达式的方法。通过建立表达式树,并运用栈来辅助处理运算符的优先级,最终实现高效地计算表达式的值。
//利用二叉树求解表达式的值 
#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 表达式树的创建
 {	
	/********************************Begin**********************/
    SqStack OPTR;
    BiTreeStack EXPT;
    InitBiTreeStack(EXPT);
    InitStack(OPTR);
    Push(OPTR,'#');

    char ch,theta,x;
    BiTree a,b;
    cin >> ch;

    while(ch != '#' || GetTop(OPTR) != '#')
    {
        if(!In(ch))
        {
            CreateExpTree(T,NULL,NULL,ch);
            PushBiTree(EXPT,T);
            cin >> ch;
        }
        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;
            }
    }
    /**********************************End***********************/
 }

 int EvaluateExTree(BiTree T){ //算法5.13 表达式树的求值
	/*******************************Begin*******************************/
    int lvalue = 0,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);
    }
    /********************************End*******************************/
 }

 int main() 
 {
   BiTree T;
   InitExpTree(T);          //创建表达式树
   cout<<EvaluateExTree(T)<<endl;             //输出值
   return 0;
 }
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值