表达树

来源:互联网 发布:家用动感单车推荐知乎 编辑:程序博客网 时间:2024/04/30 13:38
(2+3*4+5)*(2+3)2+3*4+5*2+3234*5++23+*Press any key to continue2*(4*(2+3))*4+2+1+(3-1)/22*4*2+3*4+2+1+3-1/22423+*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;  //访问根节点  }}


0 0
原创粉丝点击