逆波兰表达式学习日记(1)

来源:互联网 发布:win10没有网络协议 编辑:程序博客网 时间:2024/05/16 09:37

先看了一下栈的基本原理,也就是所谓的后进先出,然后就想完整的学习一下逆波兰表达式。下午刚上完工程制图(工程制图没认真听啊orz.....),回来就想着先写第一部分吧。

前面说了一堆废话,先给个例子

9+(3-1)×3+10/2  --------> 931-3*+102/+

将中缀表达式转化成后缀表达式,原理很简单,我先做一个关于没有“(”与“)”的例子,来简单的解释一下这个过程。


先贴代码:

//只对+-*/进行处理,不包含'(',')'的代码(本人菜得抠脚,所以....只能先写这个,而且对于数字之间也没有进行空格处理,第一个版本很粗糙啦)

char*  change(char* m1)
{
    int i,j;
    i=j=0;                                                    //i和j分别表示m1与m2存放到的位置

    char* m2=new char [100];
memset(m2,' ',sizeof(m2));
    stack <char> t;                               //定义一个栈队列
    while(m1[i]!='\0')                            //如果m1没有结束的话,就做循环
    {
        if(m1[i]>='0'&&m1[i]<='9')               //1-9直接输出,没什么原理
        {
            m2[j++]=m1[i++];
        }
        else if(m1[i]=='+'||m1[i]=='-')//因为“+”和“-”是运算优先级最小的,所以栈队列内的所有符号都加入m2,再把当前的压进去
        {
            while(t.size()!=0)
            {
                m2[j++]=t.top();
                t.pop();
            }
            t.push(m1[i++]);
        }
        else if(m1[i]=='*'||m1[i]=='/')//“*”和“/”属于运算级高的,所以如果遇到“+”,“-”,就压进去,同等级的就取出来
        {
            while(t.size()!=0)
            {
                if(t.top()=='+'||t.top()=='-')
                {
                    break;
                }
                else
                {
                    m2[j++]=t.top();
                    t.pop();


                }
            }
t.push(m1[i++]);
        }
    }
while(t.size()!=0)               //最后把t队列里的全取出来
{
m2[j++]=t.top();
t.pop();
}
    return m2;
}



//写了20分钟,改好了有括号功能的change函数了

代码2,因为思路和上面差不多,对照着看就可以看懂了

char* change(char* m1)
{
    int i,j;
    i=j=0;
    char* m2=new char [10];
memset(m2,' ',sizeof(m2));
    stack <char> t;
    while(m1[i]!='\0')
    {
        if(m1[i]>='0'&&m1[i]<='9')
        {
            m2[j++]=m1[i++];
        }
        else if(m1[i]=='+'||m1[i]=='-')
        {
while(t.size()!=0&&t.top()!='(')
            {
                m2[j++]=t.top();
                t.pop();
            }
            t.push(m1[i++]);
        }
        else if(m1[i]=='*'||m1[i]=='/')
        {
while(t.size()!=0&&t.top()!='(')
            {
                if(t.top()=='+'||t.top()=='-')
                {
                    break;
                }
                else
                {
                    m2[j++]=t.top();
                    t.pop();


                }
            }
t.push(m1[i++]);
        }
else if(m1[i]=='(')
        {
            t.push(m1[i++]);
        }
        else if(m1[i]==')')
        {
            while(t.top()!='(')
            {
                m2[j++]=t.top();
                t.pop();
            }
if(t.top()=='(') t.pop();
            i++;
        }
    }
while(t.size()!=0)
{
m2[j++]=t.top();
t.pop();
}
    return m2;
}

ok,今天先写到这里吧,下回把后缀表达式的运算方法写成代码贴出来,好烦啊,去写实验报告以及工程制图作业去了

over

原创粉丝点击