Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <Windows.h>
- #include <stack>
- #include <string>
- using namespace std;
- string wyrazenie;
- //i to indeks wyrazenia
- int i;
- //j to indeks tablicy po przerobieniu na onp
- int j;
- int dlugosc;
- void error()
- {
- cout << "krokodyle i ograngutany" << endl;
- }
- struct element_stosu
- {
- bool czy_liczba;
- int wartosc;
- char dzialanie;
- };
- stack<char> stos;
- stack<int> onp_stos;
- element_stosu tablica[700];
- int potega(int podstawa, int wykladnik)
- {
- if(wykladnik==0)
- {
- return 1;
- }
- else if(wykladnik==1)
- {
- return podstawa;
- }
- else
- {
- int i=wykladnik;
- int wynik = podstawa;
- while (i>1)
- {
- wynik = wynik*podstawa;
- i--;
- }
- return wynik;
- }
- }
- int ogarnij_liczbe()
- {
- //mam miejsce w tablicy gdzie zaczyna sie liczba
- //wiec wyrazenie[i] ma tam cos co jest cyfra w czarze
- //teraz musze policzyc ile tych cyfr mam w rzadku
- int ilosc_cyfr=0;
- int pomocnicza=i;
- while(pomocnicza<dlugosc && wyrazenie[pomocnicza]>47 && wyrazenie[pomocnicza]<58)
- {
- pomocnicza++;
- ilosc_cyfr++;
- }
- //cout << ilosc_cyfr << endl;
- //ok, teraz wiem ze mam prawidlowo policzona ilosc cyfr
- int liczba=0;
- int pom=ilosc_cyfr;
- int wykl=0;
- while(pom>0)
- {
- int nastepny= (wyrazenie[i+pom-1] - 48) * potega(10, wykl);
- liczba=liczba+nastepny;
- wykl++;
- pom--;
- }
- i=i+ilosc_cyfr;
- return liczba;
- }
- void wyjscie_stos_top()
- {
- if(!stos.empty())
- {
- cout << stos.top();
- cout << ' ';
- tablica[j].czy_liczba=0;
- tablica[j].dzialanie=stos.top();
- j++;
- stos.pop();
- }
- }
- int main()
- {
- cout << "wprowadz wyrazenie w notacji infiksowej" << endl;
- getline(cin, wyrazenie);
- dlugosc=wyrazenie.length();
- i=0;
- j=0;
- cout << "to samo ale w onp wyglada tak:" << endl;
- for(i; i<dlugosc; i++)
- {
- if(wyrazenie[i]!=32)
- {
- switch(wyrazenie[i])
- {
- case '(':
- {
- stos.push(wyrazenie[i]);
- break;
- }
- case ')':
- {
- while(stos.top()!='(')
- {
- wyjscie_stos_top();
- }
- break;
- }
- case '+':
- case '-':
- {
- while(!stos.empty() && stos.top()!='(')
- {
- wyjscie_stos_top();
- }
- stos.push(wyrazenie[i]);
- break;
- }
- case '*':
- case '/':
- {
- while(!stos.empty() && stos.top()!='+' && stos.top()!='-' && stos.top()!='(')
- {
- wyjscie_stos_top();
- }
- stos.push(wyrazenie[i]);
- break;
- }
- case '^':
- {
- while(!stos.empty() && stos.top()=='^')
- {
- wyjscie_stos_top();
- }
- stos.push('^');
- break;
- }
- }
- if(isdigit(wyrazenie[i]))
- {
- int druk=ogarnij_liczbe();
- cout << druk;
- cout << ' ';
- tablica[j].czy_liczba=1;
- tablica[j].wartosc=druk;
- j++;
- }
- }
- }
- while(!stos.empty())
- {
- if(stos.top()!='(' && stos.top()!=')')
- {
- wyjscie_stos_top();
- }
- else
- {
- stos.pop();
- }
- }
- cout << " " << endl;
- cout << "teraz bede kombinowac z obliczaniem tego" << endl;
- // struct element_stosu
- //{
- // bool czy_liczba;
- // int wartosc;
- // char dzialanie;
- //};
- //struct element_stosu tablica[700];
- //stack<int> onp_stos;
- //element_stosu tablica[700];
- //tyle mam. w tablicy jest pokolei wszystko co zostalo wypisane
- int k=0;
- //nowy iterator tablicy
- //nie wiem co jest teraz w porzednim wiec nie bede kombinowac
- //moze najpierw sprawdze co mam w tablicy
- cout << "na wszelki wypadek sprawdzamy jest w talbicy programu" << endl;
- int eustachy=j;
- while(eustachy>0)
- {
- if(tablica[k].czy_liczba==1)
- {
- cout << tablica[k].wartosc << " ";
- }
- else
- {
- cout << tablica[k].dzialanie << " ";
- }
- eustachy--;
- k++;
- }
- //ok, widze ze w tablicy mam co trzeba
- k=0;
- eustachy=j;
- while(eustachy>0)
- {
- if(tablica[k].czy_liczba==1)
- {
- onp_stos.push(tablica[k].wartosc);
- //k++;
- }
- else if(tablica[k].czy_liczba==0)
- {
- if(!onp_stos.empty())
- {
- int b=onp_stos.top();
- onp_stos.pop();
- if(!onp_stos.empty())
- {
- int a=onp_stos.top();
- onp_stos.pop();
- int wynik=0;
- switch(tablica[k].dzialanie)
- {
- case '+':
- {
- wynik=a+b;
- break;
- }
- case '-':
- {
- wynik=a-b;
- break;
- }
- case '*':
- {
- wynik=a*b;
- break;
- }
- case '/':
- {
- wynik=a/b;
- break;
- }
- case '^':
- {
- wynik=potega(a, b);
- break;
- }
- }
- onp_stos.push(wynik);
- //k++;
- }
- else
- {
- error();
- }
- }
- else
- {
- error();
- }
- }
- else
- {
- error();
- }
- eustachy--;
- k++;
- }
- cout << " " << endl;
- cout << "wynik to: " << endl;
- cout << onp_stos.top() << endl;
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement