这是我对评估后缀评估的尝试
#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 未定义,所以我认为是错误,请帮我修复它