后缀评估算法

时间:2012-09-10 07:50:57

标签: c++ stack postfix-notation

这是我对评估后缀评估的尝试

#include<iostream>
#include<string>
using namespace std;
template<class T>
class Stack
{
private:
    T *s;int N;
public:
    Stack(int maxn)
    {
        s=new T[maxn];
        N=0;
    }
    int empty()const
    {
    return N==0;
    }
    void push(T k)
    {
        s[N++]=k;
    }
    T pop()
    {
        return s[--N];
    }
    };

int main()
    {
        //postfix evaluation
        char *a="3+4*5";
        int N=strlen(a);
        Stack<int>save(N);
        for(int i=0;i<N;i++)
        {
            if(a[i]=='+')
                save.push(save.pop()+save.pop());
            if(a[i]=='*')
                save.push(save.pop()*save.pop());
            if((a[i]>='0' &&  a[i]<='9'))
                save.push(0);
            while((a[i]>='0' && a[i]<='9'))
                save.push(10*save.pop()+(a[i++]-'0'));
                    }
        cout<<save.pop()<<"  "<<endl;
    return 0;
}

但不是回答23因为4 * 5 + 3 = 23,它给出了答案5,据我所知,这段代码给了我这个结果,因为,首先它检查i = 0是否有+标记,这是不,然后它检查它是否是*,这也不是,所以它首先推0,然后它评估10 * 0 +'3' - '0',它等于3,(它将被推入堆栈),对于i = 1,a [i]等于3,所以它打印3+,第二个pop是未定义的,所以我认为这是错误的,请帮我修复它

1 个答案:

答案 0 :(得分:1)

这可以解决一些问题:

#include <iostream>
#include <cstring>

using namespace std;

template<class T>
class Stack
{
private:
    T *s;
    int N;

public:
    Stack(int maxn)
    {
        s = new T[maxn];
        N = 0;
    }
    int empty()const
    {
        return N == 0;
    }
    void push(T k)
    {
        s[N++] = k;
    }
    T pop()
    {
        return s[--N];
    }
};

int main()
{
    //postfix evaluation
    const char *a = "3 4 5*+";
    int N = strlen(a);

    Stack<int>save(N);

    for (int i = 0; i < N; i++)
    {
        if (a[i]=='+')
            save.push(save.pop() + save.pop());

        if (a[i]=='*')
            save.push(save.pop() * save.pop());

        if (a[i] >= '0' && a[i] <= '9')
        {
            save.push(0);
            while (a[i] >= '0' && a[i] <= '9')
                save.push(10 * save.pop() + a[i++] - '0');
            i--;
        }
    }

    cout << save.pop() << "  " << endl;

    return 0;
}

输出(ideone):

23

现在,如果您删除我添加的i--;,则代码将跳过a[]中的字符,因为i中有2个增量,a[i++]和{{ 1}}。

如果没有for (int i = 0; i < N; i++),则输出为(ideone):

i--;