表达式转二叉树的C++源代码

来源:互联网 发布:网络推广年度计划 编辑:程序博客网 时间:2024/06/05 07:25

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;
}

原创粉丝点击