(2+3*4+5)*(2+3)
2+3*4+5*2+3
234*5++23+*Press any key to continue
2*(4*(2+3))*4+2+1+(3-1)/2
2*4*2+3*4+2+1+3-1/2
2423+*4**2131-2/+++Press any key to continue
//算法
//先获取字符串每一个字符对应的优先级
//+-优先级1,*优先级2,,若符号在括号了它们的优先级得加上kuohao变量的值
//前奏:字符串处理ok
//在字符串中查找第一个最小的优先级符号,放进树中,同时把此位置设置为空
//若字符串只是一个字符,则是数字
//对表达树后续遍历得到后缀表达式
#include <iostream>//可以把str和a数组包裹成结构数组
#include <string>
using namespace std;
typedef struct tree* treezhi;
struct tree
{
char c;
treezhi left;
treezhi right;
};
char str[30]={0};/原始
char jiestr[30]={0},jie=0;//结果
int a[30]={0};//优先级对应数组
void str_deal();//输入字符串和处理优先级
void PreOrder(treezhi b);//先序遍历的递归算法
treezhi creat(char *t,int* at);//创建表达树
int main(int argc, char const *argv[])
{
str_deal();
treezhi head=creat(str,a);
PreOrder(head);
cout<<jiestr;
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'-':a[i]=1+kuohao;break;
case'+':a[i]=1+kuohao;break;
case'*':a[i]=2+kuohao;break;
case'/':a[i]=2+kuohao;break;
case'(':kuohao+=2;a[i]=32767;break;
case')':kuohao-=2;a[i]=32767;break;
default:a[i]=32767;
}
}
int j=0;
for ( i = 0; i < length; ++i)//去掉括号
{
if (str[i]=='(' || str[i]==')')
continue;
else
{
str[j++]=str[i];
a[j-1]=a[i];
}
}
str[j]='\0';//补尾
cout<<str;
cout<<endl;
}
treezhi creat(char *t,int* at)
{
treezhi temp=new tree;
int length=strlen(t);
int min=32767,min_seat=0;//最小优先级坐标;
if (length==1)//this is a number;
{
temp->c=t[0];//一开始这里错了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];///错误:这句忘记了
min_seat=i;
}
}
temp->c=t[min_seat];//第一个最小的优先级符号
t[min_seat]='\0';///把此位置设置为空
temp->left=creat(t,at);
temp->right=creat(t+min_seat+1,at+min_seat+1);///指针开头
}
return temp;
}
void PreOrder(treezhi b)//先序遍历的递归算法
{
if (b!=NULL)
{
PreOrder(b->left); //递归访问左子树
PreOrder(b->right); //递归访问右子树
jiestr[jie++]=b->c; //访问根节点
}
}
表达树
最新推荐文章于 2023-11-14 20:53:12 发布