2008-05-04 10:47
本程序在VC上调试运行无错误!
#include <iostream>
#include <stack>
#include <string>
using namespace std;
class Node
{
public:
char oper;//操作数或运算符
Node *left;//左子树
Node *right;//右子树
Node()
{
left=right=NULL;
oper=0;
}
Node(char op)
{
left=right=NULL;
oper=op;
}
};
bool isOper(char op)
{//判断是否为运算符
char oper[]={'(',')','+','-','*','/','^'};
for(int i=0;i<sizeof(oper);i++)
{
if(op==oper[i])
{
return true;
}
}
return false;
}
int getOperPri(char op)
{//求运算符的优先级
switch(op)
{
case '(':
return 1;
case '+':
case '-':
return 2;
case '*':
case '/':
return 3;
case '^':
return 4;
default:
return 0;
}
}
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;
}
}
void preOrderTraverse(Node *p)
{//先序遍历
if(p)
{
cout<<p->oper;
preOrderTraverse(p->left);
preOrderTraverse(p->right);
}
}
void inOrderTraverse(Node *p)
{//中序遍历
if(p)
{
if(p->left)
{
if(isOper(p->left->oper)
&& getOperPri(p->left->oper)
<getOperPri(p->oper))
{
cout<<"(";
inOrderTraverse(p->left);
cout<<")";
}
else
{
inOrderTraverse(p->left);
}
}
cout<<p->oper;
if(p->right)
{
if(isOper(p->right->oper)
&& getOperPri(p->right->oper)
<=getOperPri(p->oper))
{
cout<<"(";
inOrderTraverse(p->right);
cout<<")";
}
else
{
inOrderTraverse(p->right);
}
}
}
}
void generateTree(Node *&p, string expr)
{//生成二叉树
stack <char> operStack;
stack <Node*> dataStack;
char tmpchr,c;
int idx=0;
tmpchr=expr[idx++];
while(operStack.size()!=0 || tmpchr!='\0')
{
if(tmpchr!='\0' && !isOper(tmpchr))
{//不是运算符,则进操作数的栈
p=new Node(tmpchr);
dataStack.push(p);
tmpchr=expr[idx++];
}
else
{
switch(tmpchr)
{
case '('://进栈
operStack.push('(');
tmpchr=expr[idx++];
break;
case ')'://脱括号
while(true)
{
c=operStack.top();
operStack.pop();
if(c=='(')
{
break;
}
p=new Node(c);
if(dataStack.size())
{
p->right=dataStack.top();
dataStack.pop();
}
if(dataStack.size())
{
p->left=dataStack.top();
dataStack.pop();
}
dataStack.push(p);
}
tmpchr=expr[idx++];
break;
default:
if(operStack.size()==0 || tmpchr!='\0'
&& getOperPri(operStack.top())
< getOperPri(tmpchr))
{//进栈
operStack.push(tmpchr);
tmpchr=expr[idx++];
}
else
{//出栈
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();
}
break;
}
}
}
p=dataStack.top();
dataStack.pop();
}
int main()
{
int testCaseNum;
string expression;
Node *tree;
cout<<"请输入测试用例的数目:";
cin>>testCaseNum;
while(testCaseNum--)
{
cout<<endl<<"请输入字符串表达式:";
cin>>expression;
generateTree(tree,expression);
cout<<"中缀表达式为:";
inOrderTraverse(tree);
cout<<endl;
cout<<"前缀表达式为:";
preOrderTraverse(tree);
cout<<endl;
cout<<"后缀表达式为:";
postOrderTraverse(tree);
cout<<endl;
freeTree(tree);
}
return 0;
}