⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exprtree.h

📁 建立表达式语法树及相关操作
💻 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 + -