вот моя попытка оценки оценки постфиксапостфикса алгоритм оценки
#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+, второй поп не определен, поэтому я думаю, что это ошибка, пожалуйста, помогите мне исправить это
'3 + 4 * 5' является инфиксным, а не суффиксом (как выражение постфикса это будет' 3 4 5 * + '). Если вы хотите, чтобы ваш ввод использовался для нотации infix, вам придется преобразовать его, прежде чем вы сможете оценить его как постфиксное выражение (используя, например, [алгоритм шунтирования] (http://en.wikipedia.org/wiki/Shunting -yard_algorithm)). –
Когда я перешел на постфикс, он оценил что-то вроде -33 тысячи, почему? –
этот номер точно -33685674 –