#include <iostream>//可以把str和a数组包裹成结构数组
#include <string>
using namespace std;
typedef struct CalTree* pCalTree;
struct CalTree
{
int num;
char c;
pCalTree left;
pCalTree right;
CalTree():c('&'){}
};
char str[30]={0};/原始
int priority[30]={0};//优先级对应数组
void str_deal();//输入字符串和处理优先级
void PreOrder(pCalTree b);//先序遍历的递归算法
pCalTree creat(char *t,int* at);//创建表达树
int CalPreOrder(pCalTree b);
int main(int argc, char const *argv[])
{
str_deal();
pCalTree head=creat(str,priority);
cout<<CalPreOrder(head);
return 0;
}
void str_deal()//输入字符串和处理优先级
{
gets(str);//
int kuohao=0;//用于括号里的操作符号升级
int length=strlen(str);
for (int i = 0; i < length; ++i)
{
switch(str[i])
{
case'-':priority[i]=1+kuohao;break;
case'+':priority[i]=1+kuohao;break;
case'*':priority[i]=2+kuohao;break;
case'/':priority[i]=2+kuohao;break;
case'(':kuohao+=2;break;
case')':kuohao-=2;break;
default:priority[i]=32767;
}
}
int j=0;
for ( int i = 0; i < length; ++i)//去掉括号
{
if (str[i]=='(' || str[i]==')')
continue;
else
{
str[j++]=str[i];
priority[j-1]=priority[i];
}
}
str[j]='\0';//补尾
}
pCalTree creat(char *t,int* at)
{
pCalTree temp=new CalTree;
int length=strlen(t);
int min=32767,minPos=0;//最小优先级坐标;
bool isNumber = true;
int num = 0;
for (int i = 0; i < length; ++i)
{
if (t[i] >= '0' && t[i] <= '9')
{
num *= 10;
num += (t[i] - '0');
}
else
{
isNumber = false;
break;
}
}
if (isNumber)//this is a number;
{
temp->num = num;//一开始这里错了temp->c=t[1];
temp->left=NULL;
temp->right=NULL;
}
else
{
for (int i = 0; i < length; ++i)
{
if (at[i]<min)/找到第一个最小的优先级符号
{
min=at[i];///错误:这句忘记了
minPos=i;
}
}
temp->c=t[minPos];//第一个最小的优先级符号
t[minPos]='\0';///把此位置设置为空
temp->left=creat(t,at);
temp->right=creat(t+minPos+1,at+minPos+1);///指针开头
}
return temp;
}
void PreOrder(pCalTree b)//先序遍历的递归算法
{
if (b!=NULL)
{
PreOrder(b->left); //递归访问左子树
PreOrder(b->right); //递归访问右子树
if (b->c == '&')
cout << b->num << " ";
else
cout << b->c << " ";
}
}
int CalPreOrder(pCalTree b)
{
if (b->left == NULL && b->right == NULL)
return b->num;
switch (b->c)
{
case '+': return CalPreOrder(b->left) + CalPreOrder(b->right);break;
case '-': return CalPreOrder(b->left) - CalPreOrder(b->right);break;
case '*': return CalPreOrder(b->left) * CalPreOrder(b->right);break;
case '/': return CalPreOrder(b->left) / CalPreOrder(b->right);break;
}
return 1;
}
http://blog.csdn.net/h1023417614/article/details/18151903