#include <iostream>
#include <stack>
#include <string>
using namespace std;
int prior[1000]={0};
char oper[]={'(',')','+','-','*','/','^'};
int testcase;
string expr;
char tmpchr,c;

class Node{
public:
char oper;
Node * left;
Node * right;
Node(){left=right=NULL;};
Node(char op){left=right=NULL;oper=op;}
};
stack<char>operStack;
stack<Node *>dataStack;
void generateTree(Node * &p,int idx)
{
tmpchr=expr[idx];
while(!(operStack.top()=='#' && tmpchr=='#')){
if(!prior[tmpchr]){
p=new Node(tmpchr);
dataStack.push(p);
}
else {
switch(tmpchr){
case '(':
operStack.push('(');
break;
case ')':
c=operStack.top(); operStack.pop();
while(c!='('){
p=new Node(c);
p->right=dataStack.top(); dataStack.pop();
p->left=dataStack.top(); dataStack.pop();
dataStack.push(p);
c=operStack.top(); operStack.pop();
}
break;
default:
while(operStack.size() && prior[operStack.top()]>prior[tmpchr]){
p=new Node(operStack.top());
p->oper=operStack.top();
if(dataStack.size()){p->right=dataStack.top(); dataStack.pop();}
if(dataStack.size()){p->left=dataStack.top(); dataStack.pop();}
dataStack.push(p);
operStack.pop();
}
if(tmpchr!='#')operStack.push(tmpchr);
break;
}
}
if(tmpchr!='#')tmpchr=expr[++idx];
}
p=dataStack.top(); dataStack.pop();
}
inline void freeTree(Node * p)
{
if(p->left!=NULL)freeTree(p->left);
if(p->right!=NULL)freeTree(p->right);
delete(p);
}
void postOrderTraverse(Node * p)
{
if(p){
postOrderTraverse(p->left);
postOrderTraverse(p->right);
cout<<p->oper;
}
}
Node * tree;
int main()
{
cin>>testcase;
for(int i=0;i<7;i++)prior[oper[i]]=i+2;
prior['#']=1;
while(testcase--){
cin>>expr;
while(operStack.size())operStack.pop();
operStack.push('#');
while(dataStack.size())dataStack.pop();
generateTree(tree,1);
postOrderTraverse(tree);
cout<<endl;
freeTree(tree);
}
}
// 输入格式 #表达式#
这篇博客详细介绍了如何使用C++实现表达式二叉树。通过建立优先级数组和操作符栈,将表达式转化为二叉树,并进行后序遍历。代码中包含了从输入读取表达式,构建、遍历和释放二叉树节点的过程。

Node()
2540

被折叠的 条评论
为什么被折叠?



