#include<iostream>
#include<string>
#include<stack>
using namespace std;
//二叉树的结构
typedef struct BiTNode
{
int data;//数据域
struct BiTNode* lchild = nullptr;//指针必须初始化,c11标准
struct BiTNode* rchild = nullptr;//左右孩子
}BiTNode, * BiTree;;
//二叉树的结构
//创建二叉树
void CreateExpTree(BiTree& T, BiTree a, BiTree b, char theta)
{
T = new BiTNode;
T->data = theta;
T->lchild = a;
T->rchild = b;
}
//创建二叉树
//判断是否为数字
int In(char ch)//判断是否为数字
{
if (ch >= '0' && ch <= '9')
{
return 1;
}
return 0;
}
//判断是否为数字
//判断优先级
char Precede(char a, char b)
{
char c;
if (a == '#' && b != '#') c = '<';
if (a == '#' && b == '#') c = '=';
else if (a == '+' || a == '-')
{
if (b == '+' || b == '-' || b == ')' || b == '#')
{
c = '>';
}
else
{
c = '<';
}
}
else if (a == '*' || a == '/')
{
if (b == '(')
{
c = '<';
}
else
{
c = '>';
}
}
else if (a == '(')
{
if (b == ')')
{
c = '=';
}
else if (b == '+' || b == '-' || b == '*' || b == '/' || b == '(')
{
c = '<';
}
}
else if (a == ')')
{
if (b == '+' || b == '-' || b == '*' || b == '/' || b == ')')
{
c = '>';
}
}
return c;
}
//判断优先级
int GetValue(int a, char b, int c)//运算函数
{
int sum = 0;
switch (b)
{
case '+':
sum = a + c;
break;
case '-':
sum = a - c;
break;
case '*':
sum = a * c;
break;
case '/':
sum = a / c;
break;
default:
break;
}
return sum;
}
//表达式求值
int EvaluateExpTree(BiTree T)
{
int lvalue = 0;//左子树的计算值
int rvalue = 0;//右子树的计算值
if (T->lchild == NULL && T->rchild == NULL)
{
return T->data;//返回
}
else
{
lvalue = EvaluateExpTree(T->lchild);//遍历左子树
rvalue = EvaluateExpTree(T->rchild);//遍历右子树
return GetValue(lvalue,(char)T->data , rvalue);//计算左右子树的和
}
}
//表达式求值
//表达树的创建
void InitExpTree()
{
stack<BiTree> EXPT;//运算数栈
stack<char> OPTR;//操作符栈
int num = 0;//表示运算数
OPTR.push('#');
BiTree a ,b;
BiTree T1 = new BiTNode;
char ch;
cin >> ch;
while (ch != '#' || OPTR.top() != '#')
{
if (In(ch))//判断是否为运算符
{
num = ((ch - '0') + num * 10);//由于我们是按char类型输入的,我们要把char类型转化成整型
cin >> ch;
}
else
{
if (num != 0)//若下一个字符不为数字,则将num压入运算数栈中
{
BiTree T = new BiTNode;
T->data = num;
EXPT.push(T);
num = 0;
}
switch (Precede(OPTR.top(), ch))//比较运算符的优先级,进行操作
{
case'<':
OPTR.push(ch);
cin >> ch;
break;
case'>':
b = EXPT.top();//取栈顶元素
EXPT.pop();//栈顶元素出栈
a = EXPT.top();
EXPT.pop();
BiTree TT;
CreateExpTree(TT, a, b, OPTR.top());//将OPTR栈顶元素取出,创建一个新树
OPTR.pop();//OPTR栈顶元素出栈
EXPT.push(TT);
break;
case'=':
OPTR.pop();
cin >> ch;
break;
}
}
}
cout << EvaluateExpTree(EXPT.top());
}
//表达树的创建
int main()
{
InitExpTree();
return 0;
}
计算器-二叉树实现
最新推荐文章于 2023-12-02 00:52:33 发布