алгоритм оценки постфикса

вот моя попытка оценки оценки postfix

#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+, второй всплеск не определен, поэтому я думаю, что это ошибка, пожалуйста, помогите мне исправить это

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[] из-за 2 приращений i, в a[i++] а также for (int i = 0; i < N; i++),

Без i--; выход (ideone):

9
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]