📄 exprtree.h
字号:
#include "Stack.h"
#include <iostream>
#include "Priority.h"
using namespace std;
//树节点的声明与定义
class Node{
public:
int oper;
Node* left;
Node* right;
Node(){left=right=NULL;}
Node(char op){left=right=NULL;oper=op;}
};
//表达式语法树类的声明
class ExprTree
{
private:Node *p,*a,*b;
char Theta;
LinkStack <char>OperStack;
LinkStack <Node*>DataStack;
public:Node* t;
ExprTree();
void generateTree(string &exp);
int Transfer(char a);
void ReTransfer(Node *k);
int TraversalSum(Node* k);
int cacu(int m,int op,int n);
void printtree(Node *t,int i);
};
//表达式语法树类中函数的函数体
//构造函数,首先将#入栈
ExprTree::ExprTree()
{
OperStack.Push('#');
}
//语法树类的构树函数
void ExprTree::generateTree(string &exp)
{
Priority compare;
int i=0,temp;
t=NULL;
while (!OperStack.Empty())
{
if (exp[i]<='9' && exp[i]>='0') //若为数字,则进行入栈处理
{
temp=exp[i]-48;
while (exp[i+1]<='9' && exp[i+1]>='0')
{
temp=(temp*10)+(exp[i+1]-48);
i++;
}
p=new Node(temp);
DataStack.Push(p);
i++;
}
else
{
if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/'||exp[i]=='('||exp[i]==')'||exp[i]=='#') //否则若为运算符,则分情况处理
{
switch (compare.PriOPTR(OperStack.GetTop(),exp[i])){
case '<':
OperStack.Push(exp[i]);
i++;
break;
case '=':
OperStack.Pop();
i++;
break;
case '>':
Theta=OperStack.GetTop();
OperStack.Pop();
t=new Node(Transfer(Theta));
a=DataStack.GetTop();
DataStack.Pop();
b=DataStack.GetTop();
DataStack.Pop();
t->right=a;
t->left=b;
DataStack.Push(t);
break;
default:
cout<<"Input Error";
cin.clear();
cin.ignore();
char a=cin.get();
exit(0);
}
}
else i++;
}
}
if (DataStack.Empty()){
cout <<"Input Error";
cin.clear();
cin.ignore();
char a=cin.get();
exit(0);
}
}
//运算符转换为对应数字的转换函数
int ExprTree::Transfer(char m)
{
switch (m)
{
case '+':return 1;
case '-':return 2;
case '*':return 3;
case '/':return 4;
}
}
//数字反转换为对应该运算符转换函数
void ExprTree::ReTransfer(Node *k)
{
if (k->left==NULL&&k->right==NULL)
cout<<k->oper;
else switch(k->oper)
{
case 1:cout<<"+";break;
case 2:cout<<"-";break;
case 3:cout<<"*";break;
case 4:cout<<"/";break;
}
}
//计算语法树的值的函数
int ExprTree::TraversalSum(Node* k)
{
int m,n;
if(k==NULL)
{
cout<<"Input Error";
cin.clear();
cin.ignore();
char a=cin.get();
exit(0);
}
if (k->left==NULL&&k->right==NULL)
{
return k->oper;
}
if (k->left)
{
m=TraversalSum(k->left);
}
if (k->right)
{
n=TraversalSum(k->right);
}
return cacu(m,k->oper,n);
}
//运算符转换函数2
int ExprTree::cacu(int m,int op,int n)
{
switch (op)
{
case 1:return m+n;
case 2:return m-n;
case 3:return m*n;
case 4:return m/n;
}
}
//遍历及打印语法树
void ExprTree::printtree(Node *t,int i)
{ if(t->right) printtree(t->right,i+1);
for(int k=1;k<=i;k++)
cout<<" ";
ReTransfer(t);
cout<<'\n';
if(t->left) printtree(t->left,i+1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -