qt中缀转后缀算法(用栈)(新手 欢迎指点错误)

来源:互联网 发布:保险网络大学考试官网 编辑:程序博客网 时间:2024/06/05 22:25

中缀就是我们常见的一些的数学式子,比如:3+4,(3+4)*4+1,等。

而后缀是计算机计算比较好用的一个方式。比如:34+,

qt我们可以先创建一个项目。

首先我们要建栈,栈是比较好建的。

#define max 100
typedef char data;
typedef struct{
    //int max=10;
    char a[10];//你可自己定义大小,这里方便处理,定义10。
    int top;
}slist_stack;
建完栈然后要处理栈,

更新:

 
slist_stack *l;//后面都用l;
l->top=0;

删除://栈是先进后出行,操作都在栈顶,也就是top;

if(l->top==0)
    {
        qDebug()<<"无数据!";
        return -1;
    }
    else
    {
        l->top-=1;
        return 1;
    }
增添:

if(l->top==10)//刚刚定义了数据大小为10;
    {
        qDebug()<<"栈已满!";
                 return -1;
    }
    else
    {
        l->a[l->top]=data;//data你要插入的数据;
        l->top++;
        return 1;
    }
做完这些,我们可以去写转化的函数

转化的要求:(我自己总结的话语,有点毛糙,但容易理解)注:这里没有考虑小数,小数的话就是小数点后面数除以10,100,1000等等。

//1:如果是(则直接进栈,若为数字直接输出,
    //2:如果是+-*/,则判定栈定的元素优先级是否比现在的符号优先级高,若低,栈输出,低的进栈。否则进栈
    //3:如果是),是栈中的(之前的所有的符号出栈;
    reset(l);//重置栈就是更新,我把它写到函数里了
    int j=0,i=0;
    char f[20];//存放后缀表达式的数组(大小可以定以)
    while(c[i]!='#')//c[]数组存放的是中缀表达式,以#结尾。(当然也可以不用,可以用数组的大小)
    {
        if(c[i]=='(')//符号进栈
        {
            l->a[l->top]=c[i];//进栈的操作
            l->top++;
            qDebug()<<"栈的符号数为:"<<l->top;//来调试栈的符号数
        }
        else if(c[i]>=48&&c[i]<=57)//0到9的的ascii码,数字输出
         {
            f[j++]=c[i];//数字输出到数组里
        }
        else if(c[i]=='+'||c[i]=='-')//+,-,优先级低于*,/
        {
            if(l->a[l->top-1]=='('||l->a[l->top-1]=='+'||l->a[l->top-1]=='-')//若栈顶的符号优先级不高等进栈
            {
                l->a[l->top]=c[i];
                l->top++;
                qDebug()<<"栈的符号数为:"<<l->top;
            }
            else//否则则输出栈顶的元素,且出栈,然后把从c[i](低级的符号)进栈
            {
                f[j++]=l->a[l->top-1];
                l->top=l->top-1;
                l->a[l->top]=c[i];
                l->top++;
                qDebug()<<"栈的符号数为:"<<l->top;
            }
          }
        else if(c[i]=='*'||c[i]=='/')//直接进栈,因为你其优先级最高
        {
            l->a[l->top]=c[i];
            l->top++;
            qDebug()<<"栈的符号数为:"<<l->top;
          }
        else if(c[i]==')')//碰到右括号时,吧栈左括号前面的全部输出
        {
            while(l->a[l->top-1]!='(')
            {
                f[j++]=l->a[l->top-1];
                 l->top=l->top-1;
            }
             l->top=l->top-1;
             qDebug()<<"栈的符号数为:"<<l->top;
        }
        i++;
    }
        while(l->top!=0)//判定栈是否为空,不为则直接输出.
        {
            f[j++]=l->a[l->top-1];
            del(l);
        }
        QString a;
      for(int i1=0;i1<j;i1++)//这个可有可无 我是用来查看的,可能多此一举了
      {
          a+=f[i1];
      }
      f[j++]='#';
      qDebug()<<a;
//转化完成了

原创粉丝点击