Hej!
Napisałam program konwertujący ciąg znaków z ONP na standardowy zapis. Nie jest to jeszcze do końca skończone bo nie uwzględniłam nawiasów ani potęg, ale najpierw chcę, żeby zadziałał na tym prostym przykładzie. Niestety pętla while która używa boolów jako warunku wykonuje się w nieskończoność. Dlaczego? (warunek to- dopóki pierwsza liczba na stosie nie jest znakiem (jest liczbą) i jednocześnie druga liczba na stosie też jest liczbą, wykonuj:...) Kiedy dochodzi do wykonania pętli, na stosie mam "3;2;*;5", więc dla zestawu "*;5" się wykona, po usunięciu 5 dla zestawu *, 2 też powinna się wykonać, jednak tu się zapętla. Dlaczego tak się dzieje?
#include <iostream>
using namespace std;
string stos[20];
int r;
string pom, pom1;
bool empty(int r)
{
if(r==0) return true;
}
void push(string znak)
{
if(r>0) pom=stos[r];
else pom="";
r=r+1;
stos[r]=znak;
pom1=stos[r];
}
void pop(int r)
{
stos[r]="";
r=r-1;
if(r>0) pom1=stos[r];
else pom="";
}
void sprawdz_poprzedni(int r)
{
pom1=stos[r];
r=r-1;
pom=stos[r];
r=r+1;
stos[r]=pom1;
}
bool czy_znak(string m)
{
if(m=="+"||m=="-"||m=="*"||m=="/") return true;
}
int main()
{
string w="325*+", znak, l, x;
int i=0;
while(i<w.length())
{
znak=w[i];
if(czy_znak(znak)==false)
{
push(znak);
}
else
{
if(czy_znak(pom1)==false && czy_znak(pom)==false)
{
x=pom1;
pop(r);
push(znak);
push(x);
}
else
{
while(czy_znak(pom)==true || czy_znak(pom1)==true) //NIESKONCZONA
{
l+=pom1;
pop(r);
sprawdz_poprzedni(r);
}
l+=pom1;
pop(r);
sprawdz_poprzedni(r);
push(znak);
for(int j=l.length()-1; j>=0; j--)
{
x=l[j];
push(x);
}
l="";
}
}
i++;
}
for(int k=1; k<=r; k++) cout << stos[k];
return 0;
}