1

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

#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 未定义,所以我认为是错误,请帮我修复它

4

1 回答 1

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, ina[i++]for (int i = 0; i < N; i++).

没有i--;输出是(ideone):

9
于 2012-09-10T08:20:58.580 回答