前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用二叉树计算表达式值

利用二叉树计算表达式值

作者头像
AngelNH
发布2020-04-16 11:16:41
1.9K0
发布2020-04-16 11:16:41
举报
文章被收录于专栏:AngelNI

有时候,灵感+努力+伙伴的箴言就是成功。

二叉树实现简单表达式求值

这是我们的数据结构作业,因为之前用双栈实现过(双栈实现计算器),再写起来就轻松多了。二叉树实现表达式求值实际上是一个后序遍历二叉树的过程,根据规则左右根,找到左结点,右结点,和根节点,进行运算就可以了,好了下面就直接上代码了。

:此程序能够实现10以内的加减乘除(结果无所谓),记得要以#结尾哦。

代码语言:javascript
复制
#include<stdio.h>
#include<iostream>
#include<cctype>
#include<stack>
#include<stdlib.h>
using namespace std;
//定义树节点 
struct TNode
{
	char cha;
	struct TNode *lchild,*rchild;
};
//定义树根 最顶树根 
TNode * Tree;
char compare(char a, char b)
{
    int i, j;
    char pre[7][7] =                        
    {	//定义运算符之间的优先级
        {'>','>','<','<','<','>','>'},
        {'>','>','<','<','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'<','<','<','<','<','=','0'},
        {'>','>','>','>','0','>','>'},
        {'<','<','<','<','<','0','='},
    };
    switch(a)
    {
    case '+':
        i = 0;
        break;
    case '-':
        i = 1;
        break;
    case '*':
        i = 2;
        break;
    case '/':
        i = 3;
        break;
    case '(':
        i = 4;
        break;
    case ')':
        i = 5;
        break;
    case '#':
        i = 6;
        break;
    }
    switch(b)
    {
    case '+':
        j = 0;
        break;
    case '-':
        j = 1;
        break;
    case '*':
        j = 2;
        break;
    case '/':
        j = 3;
        break;
    case '(':
        j = 4;
        break;
    case ')':
        j = 5;
        break;
    case '#':
        j = 6;
        break;
    default:
        printf("表达式要以#结尾!!!\n");
        exit(1);
    }
    return pre[i][j];
}
//创建树节点 
TNode * CreatNode(TNode *T,TNode *l,TNode *r,char ch)
{
	T->cha = ch;
	T->lchild = l;
	T->rchild = r;
	return T;
}
//读入表达式 
void init_EXPT()
{
	stack<TNode *> EXPT;
	stack<char> OPTR;
	OPTR.push('#');
	char ch;
	cin>>ch;
	while(ch!='#'||OPTR.top()!='#')
	{
		if(isdigit(ch))
		{
			TNode *T ;
			T = (TNode *)malloc(sizeof(TNode));
			Tree = CreatNode(T,NULL,NULL,ch);
			EXPT.push(Tree);
			cin>>ch;
		}
		if(!isdigit(ch))
		{
			if(OPTR.empty())
				OPTR.push(ch);
			else
			{
				char top;
				top = OPTR.top();
				switch(compare(top,ch))
				{
					case '<':
						{
							OPTR.push(ch);
							cin>>ch;
							break;
						}
					case '>':
						{
							TNode * T ,*a,*b;
							T = (TNode *)malloc(sizeof(TNode));
							char theta = OPTR.top();OPTR.pop();
							b = EXPT.top();EXPT.pop();
							a = EXPT.top();EXPT.pop();
							Tree = CreatNode(T,a,b,theta);
							EXPT.push(Tree);
							break;
						}
					case '=':
						{
							OPTR.pop();
							cin>>ch;
							break;
						}
				}
			}
		}
	}
}
//计算表达式 
float getvalue(char optr,float a,float b)
{
	float result ;
	switch(optr)
	{
		case '+':
			{
				result = (float)a+(float)b;
				break;
			}
		case '-':
			{
				result = (float)a-(float)b;
				break;
			}
		case '*':
			{
				result = (float)a*(float)b;
				break;
			}
		case '/':
			{
				result = (float)a/(float)b;
				break;
			}
	}
	return result;
}
float calculate(TNode *T)
{
	float lvalue,rvalue;
	lvalue = rvalue = 0;
	if(T->lchild==NULL&&T->rchild==NULL)
		return T->cha - '0';
	else
	{
		lvalue = (float)calculate(T->lchild);
		rvalue = (float)calculate(T->rchild);
		return getvalue(T->cha,lvalue,rvalue);
	}
}

int main() 
{
	float result;
    cout<<"请输入表达式并以'#'结尾(例如:7/(5+2)#):"<<endl;
	init_EXPT();
	
	result = calculate(Tree);
	cout<<result<<endl;
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-20|,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二叉树实现简单表达式求值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档