Witam. Mam problem z implementacją tego zadania:
Oblicz wartość wyrażenia zapisanego w postaci ONP. Działania to: - (odejmowanie), + (dodawanie), / (dzielenie całkowite), * (mnożenie). Wszystkie liczby są jednocyfrowe.
Postać ONP (czyli Odwrotna notacja polska) to zapis działań arytmetycznych, w którym argumenty wyrażenia poprzedzają to wyrażenie. Na przykład zamiast
2 + 3
pisze się
2 3 +
natomiast zamiast
(2 + 3) * 6
będzie
2 3 + 6 *
Wejście
W pierwszym wierszu dana jest jedna liczba (<=1000), mówiąca ile będzie zestawów danych. Każdy zestwa składa się w dwóch wierszy. W pierwszym dana jesli długość wyrażenia (<=1000). W drugim wierszu podane jest wyrażenie. Występują w nim tylko znaki: 0,1,2,3,4,5,6,7,8,9,-,+,/,*. Wszystkie liczby w wyrażeniu należy traktować jako liczby jednocyfrowe. Możesz założyć, że wynik zmieści się zakresie int'a
Wyjście
Dla każdego zestawu danych należy wypisać jedną liczbę całkowitą będącą wynikiem wyrażenia, lub wypisać słowo BRAK gdy wynik ten nie istnieje, tj. np. wyrażenie jest niepoprawne, lub np. występuje w nim dzielenie przez 0.
Przykład
Dla danych wejściowych
3
7
62-01+/
9
12345****
11
12--345****
poprawną odpowiedzią jest
4
120
BRAK
Mianowicie nie widzę żadnego błędu w moim programie. Sprawdzarka wyrzuca mi błąd, że jest nieprawidłowy wynik. Mógłby ktoś nakierować na błąd w moim programie, lub wskazać przykład dla którego wynik jest niepoprawny? Niżej zamieszczam sam program:
#include <iostream>
#include <string>
#include <stack>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
int ile_razy, dlugosc_wyrazenia, z, i;
stack<int> stos;
string wyrazenie, tymczasowy;
int zmienna1, zmienna2, ile_liczb=0, ile_znakow=0;
bool dobrze=true;
cin>>ile_razy;
vector<int> w;
bool tablicaboolow[ile_razy];
for(i=1; i<=ile_razy; i++)
{
cin>>dlugosc_wyrazenia>>wyrazenie;
if(dlugosc_wyrazenia!=wyrazenie.size())
dobrze=false;
for(int k=0;k<dlugosc_wyrazenia; k++)
{
if(wyrazenie[k]>=48 && wyrazenie[k]<=57)
{
tymczasowy=wyrazenie[k];
int h=atoi(tymczasowy.c_str());
stos.push(h);
ile_liczb++;
}
if(wyrazenie[k]==43 || wyrazenie[k]==42 || wyrazenie[k]==45 || wyrazenie[k]==47)
{
if(stos.size()>=2)
{
zmienna2=stos.top();
stos.pop();
zmienna1=stos.top();
stos.pop();
if(wyrazenie[k]==43)
z=zmienna1+zmienna2;
if(wyrazenie[k]==42)
z=zmienna1*zmienna2;
if(wyrazenie[k]==45)
z=zmienna1-zmienna2;
if(wyrazenie[k]==47)
{
if(zmienna2==0)
dobrze=false;
else
z=zmienna1/zmienna2;
}
stos.push(z);
}
ile_znakow++;
}
if(k==dlugosc_wyrazenia-1)
{
if(stos.size()!=1)
dobrze=false;
}
if(ile_znakow>=ile_liczb)
dobrze=false;
}
if(dobrze==true)
{
w.push_back(stos.top());
tablicaboolow[i-1]=true;
}
else
tablicaboolow[i-1]=false;
while(!stos.empty())
stos.pop();
dobrze=true;
wyrazenie="";
ile_liczb=0;
ile_znakow=0;
}
for(int l=0; l<ile_razy; l++)
{
if(tablicaboolow[l]==false)
cout<<"BRAK"<<endl;
else
cout<<w[l]<<endl;
}
return 0;
}