Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- template <class T>
- class Element
- {
- public:
- T wartosc;
- Element *nastepny;
- };
- template <class T>
- class Stos {
- public:
- Element<T> *pierwszy_element;
- int rozmiar;
- Stos()
- {
- pierwszy_element=nullptr;
- rozmiar=0;
- }
- bool pusty()
- {
- return !pierwszy_element;
- }
- Element<T> *wierzcholek_stosu()
- {
- return pierwszy_element;
- }
- void dodaj_element(T a)
- {
- Element<T> *tmp=new Element<T>;
- tmp->wartosc=a;
- tmp->nastepny=pierwszy_element;
- pierwszy_element=tmp;
- rozmiar++;
- }
- void usun_wierzcholek()
- {
- if(pierwszy_element)
- {
- Element<T> *tmp=pierwszy_element;
- pierwszy_element=pierwszy_element->nastepny;
- delete tmp;
- rozmiar--;
- }
- }
- };
- template <class T>
- class Kolejka
- {
- public:
- Element<T> *pierwszy;
- Element<T> *ostatni;
- int rozmiar;
- Kolejka()
- {
- pierwszy=ostatni=nullptr;
- rozmiar=0;
- }
- bool pusty()
- {
- return !pierwszy;
- }
- Element<T> *piersza_wartosc()
- {
- if(pierwszy)
- {
- return pierwszy;
- }
- else
- {
- return nullptr;
- }
- }
- void dodaj_element(string a)
- {
- Element<T> *tmp=new Element<T>;
- tmp->nastepny=nullptr;
- tmp->wartosc=a;
- if(ostatni)
- {
- ostatni->nastepny=tmp;
- }
- else
- {
- pierwszy=tmp;
- }
- ostatni=tmp;
- rozmiar++;
- }
- void usun_wierzcholek()
- {
- if(pierwszy)
- {
- Element<T> *tmp=pierwszy;
- pierwszy=pierwszy->nastepny;
- if(!pierwszy)
- {
- ostatni=nullptr;
- }
- delete tmp;
- rozmiar--;
- }
- }
- };
- bool sprawdz_nawiasy(const string &dzialanie)
- {
- Stos<char> stos2;
- string nawiasy="";
- string _tmp;
- for(char c:dzialanie)
- {
- if(c=='(' || c=='[' || c=='{' || c==')' || c==']' || c=='}')
- {
- nawiasy=nawiasy+c;
- }
- }
- for(char c:nawiasy)
- {
- if(c=='(' || c=='[' || c=='{')
- {
- stos2.dodaj_element(c);
- }
- if(stos2.pusty())
- {
- return false;
- }
- if(c==')')
- {
- _tmp=stos2.wierzcholek_stosu()->wartosc;
- stos2.usun_wierzcholek();
- if(_tmp=="{" || _tmp=="[")
- {
- return false;
- }
- }
- else if(c=='}')
- {
- _tmp=stos2.wierzcholek_stosu()->wartosc;
- stos2.usun_wierzcholek();
- if(_tmp=="(" || _tmp=="[")
- {
- return false;
- }
- }
- else if(c==']')
- {
- _tmp=stos2.wierzcholek_stosu()->wartosc;
- stos2.usun_wierzcholek();
- if(_tmp=="(" || _tmp=="{")
- {
- return false;
- }
- }
- }
- return stos2.pusty();
- }
- bool odwrocona_notacja_polska(const string &dzialanie, Kolejka<string> &kolejka)
- {
- Stos<string> Stos;
- string tmp1="";
- string::size_type zmienna;
- if(!sprawdz_nawiasy(dzialanie))
- {
- while(!kolejka.pusty())
- {
- kolejka.usun_wierzcholek();
- }
- cout<<"BLAD"<<endl;
- return false;
- }
- for(int i=0; i<dzialanie.size(); i++)
- {
- if(dzialanie[i]=='(' || dzialanie[i]=='[' || dzialanie[i]=='{')
- {
- string tmp="";
- tmp += dzialanie[i];
- Stos.dodaj_element(tmp);
- }
- else if(dzialanie[i]==')')
- {
- while(!Stos.pusty())
- {
- if(Stos.wierzcholek_stosu()->wartosc=="(")
- {
- Stos.usun_wierzcholek();
- break;
- }
- else
- {
- kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
- Stos.usun_wierzcholek();
- }
- }
- }
- else if(dzialanie[i]==']')
- {
- while(!Stos.pusty())
- {
- if(Stos.wierzcholek_stosu()->wartosc=="[")
- {
- Stos.usun_wierzcholek();
- break;
- }
- else
- {
- kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
- Stos.usun_wierzcholek();
- }
- }
- }
- else if(dzialanie[i]=='+' || dzialanie[i]=='-')
- {
- while(!Stos.pusty())
- {
- if(Stos.wierzcholek_stosu()->wartosc=="(" || Stos.wierzcholek_stosu()->wartosc=="[" || Stos.wierzcholek_stosu()->wartosc=="{")
- {
- string tmp="";
- tmp += dzialanie[i];
- Stos.dodaj_element(tmp);
- break;
- }
- else
- {
- kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
- Stos.usun_wierzcholek();
- }
- }
- if(Stos.pusty())
- {
- string tmp="";
- tmp += dzialanie[i];
- Stos.dodaj_element(tmp);
- }
- }
- else if(dzialanie[i]=='}')
- {
- while(!Stos.pusty())
- {
- if(Stos.wierzcholek_stosu()->wartosc=="{")
- {
- Stos.usun_wierzcholek();
- break;
- }
- else
- {
- kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
- Stos.usun_wierzcholek();
- }
- }
- }
- else if(dzialanie[i]=='*' || dzialanie[i]=='/')
- {
- while(!Stos.pusty())
- {
- if(Stos.wierzcholek_stosu()->wartosc=="(" || Stos.wierzcholek_stosu()->wartosc=="[" || Stos.wierzcholek_stosu()->wartosc=="{" || Stos.wierzcholek_stosu()->wartosc=="-" || Stos.wierzcholek_stosu()->wartosc=="+")
- {
- std::string tmp="";
- tmp += dzialanie[i];
- Stos.dodaj_element(tmp);
- break;
- }
- else
- {
- kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
- Stos.usun_wierzcholek();
- }
- }
- if(Stos.pusty())
- {
- string tmp="";
- tmp+=dzialanie[i];
- Stos.dodaj_element(tmp);
- }
- }
- else
- {
- tmp1=tmp1+dzialanie[i];
- if(i+1!=dzialanie.size())
- {
- if(dzialanie[i+1]<48 || dzialanie[i+1]>57)
- {
- kolejka.dodaj_element(tmp1);
- tmp1="";
- }
- }
- else
- {
- kolejka.dodaj_element(tmp1);
- tmp1="";
- }
- }
- }
- while(!Stos.pusty())
- {
- kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
- Stos.usun_wierzcholek();
- }
- return true;
- }
- void oblicz(Kolejka<string> &kolejka)
- {
- Stos<double> Stos;
- long double wynik=0;
- long double a,b;
- string::size_type zmienna;
- if(kolejka.pusty())
- {
- cout<<endl;
- return;
- }
- if(kolejka.rozmiar==1 && stold(kolejka.piersza_wartosc()->wartosc,&zmienna))
- {
- cout<<kolejka.piersza_wartosc()->wartosc<<endl;
- kolejka.usun_wierzcholek();
- return;
- }
- for(;!kolejka.pusty();)
- {
- if(kolejka.piersza_wartosc()->wartosc != "*" && kolejka.piersza_wartosc()->wartosc != "/" && kolejka.piersza_wartosc()->wartosc != "+" && kolejka.piersza_wartosc()->wartosc != "-")
- {
- Stos.dodaj_element(stoi(kolejka.piersza_wartosc()->wartosc,&zmienna));
- kolejka.usun_wierzcholek();
- }
- if(kolejka.piersza_wartosc()->wartosc=="+")
- {
- kolejka.usun_wierzcholek();
- b=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- a=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- wynik=a+b;
- Stos.dodaj_element(wynik);
- }
- else if(kolejka.piersza_wartosc()->wartosc=="-")
- {
- kolejka.usun_wierzcholek();
- b=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- a=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- wynik=a-b;
- Stos.dodaj_element(wynik);
- }
- else if(kolejka.piersza_wartosc()->wartosc=="/")
- {
- kolejka.usun_wierzcholek();
- b=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- a=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- wynik=a/b;
- Stos.dodaj_element(wynik);
- }
- else if(kolejka.piersza_wartosc()->wartosc=="*")
- {
- kolejka.usun_wierzcholek();
- b=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- a=Stos.wierzcholek_stosu()->wartosc;
- Stos.usun_wierzcholek();
- wynik=a*b;
- Stos.dodaj_element(wynik);
- }
- }
- int Wynik_INT=Stos.wierzcholek_stosu()->wartosc;
- cout<<Wynik_INT;
- cout<<endl;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- int n;
- string dzialanie;
- Kolejka<string> kolejka;
- cin>>n;
- int i=0;
- while(i<n)
- {
- cin>>dzialanie;
- if(odwrocona_notacja_polska(dzialanie,kolejka))
- {
- oblicz(kolejka);
- }
- i++;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement