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