Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- #include <cstring>
- #include <math.h>
- #include <string>
- using namespace std;
- struct Znak
- {
- string znak;
- Znak *next;
- Znak(string znak)
- {
- this->znak=znak;
- next=NULL;
- }
- };
- class StosZnakow
- {
- public:
- Znak *first;
- int size;
- StosZnakow()
- {
- first=NULL;
- size=0;
- }
- void push(string znak)
- {
- Znak *temp = new Znak(znak);
- temp->next=first;
- first=temp;
- size++;
- }
- Znak* pop()
- {
- if(first==NULL)
- return NULL;
- else
- {
- Znak *temp=first;
- first=first->next;
- size--;
- return temp;
- }
- }
- bool isEmpty()
- {
- if(size==0)
- return true;
- else
- return false;
- }
- void wyswietl()
- {
- Znak *temp=first;
- if(temp==NULL)
- cout << "stos pusty";
- else
- {
- while(temp!=NULL)
- {
- cout << temp->znak;
- temp=temp->next;
- }
- }
- }
- string top()
- {
- Znak *roboczy = first;
- if (roboczy == NULL)
- cout << "";
- else
- {
- return roboczy->znak;
- }
- }
- };
- //string s(" ( 3 + ( 2 * 4 ) ) ");
- //string ss("[ ( 1 + 1243 ] )");
- //string ssss("( 1 ) )");
- //istringstream iss(s);
- void toONP_String(string s)
- {
- string part;
- string a,c,pom;
- istringstream iss(s,istringstream::in);
- iss>>c;
- if(c == "(" || c== "["){
- //if(strcmp(c,pom1) == 0 || strcmp(c,pom2) == 0){
- toONP_String(s);
- iss>>a;
- toONP_String(s);
- iss>>pom;
- cout<<a;
- }
- else{
- cout<<c;
- //getline(cin,sss);
- }
- }
- bool CzyNawias(string obecny)
- {
- if(obecny == "[" || obecny == "(" || obecny == "{" || obecny == "]" || obecny == ")" || obecny == "}")
- return true;
- else
- return false;
- }
- bool CzyNawiasOt(string obecny)
- {
- if(obecny == "[" || obecny == "(" || obecny == "{")
- return true;
- else
- return false;
- }
- bool CzyNawiasZam(string obecny)
- {
- if(obecny == "]" || obecny == ")" || obecny == "}")
- return true;
- else
- return false;
- }
- bool CzyLiczba(string obecny)
- {
- if(isdigit(obecny.at(0)) == true || obecny.at(0) == '-')
- return true;
- else
- return false;
- }
- bool CzyOperator(string obecny)
- {
- if(CzyNawiasOt(obecny) == false && CzyNawiasZam(obecny) == false && isdigit(obecny.at(0)) == false && obecny.at(0) != '-')
- return true;
- else
- return false;
- }
- int bledna_skladnia(string s)
- {
- StosZnakow Stos;
- istringstream iss(s);
- string obecny;
- int counter = 0;
- int LicznikObrotow = 0;
- //int LicznikIfow = 0;
- int rozmiar;
- iss>>obecny;
- while(!iss.eof()){
- LicznikObrotow++;
- if(CzyLiczba(obecny) == true){ // liczba po liczbie ( dwie liczby obok siebie)
- //LicznikIfow++;
- iss>>obecny;
- rozmiar = obecny.length();
- //for(int i = 0; i < rozmiar; i++)
- if(CzyLiczba(obecny) == true ){
- counter++;
- }
- }else
- if(CzyNawiasOt(obecny) == true){
- //LicznikIfow++;
- iss>>obecny;
- rozmiar = obecny.length();
- //for(int i = 0; i < rozmiar; i++)
- if(CzyLiczba(obecny) == false && CzyNawiasOt(obecny) == false){
- counter++;
- }
- }else
- if(CzyOperator(obecny) == true){ //jest operatorem
- //LicznikIfow++;
- iss>>obecny;
- rozmiar = obecny.length();
- //for(int i = 0; i < rozmiar; i++)
- if((CzyLiczba(obecny) == false && CzyNawiasOt(obecny) == false) || LicznikObrotow == 1){
- counter++;
- }
- }else
- if(CzyNawiasZam(obecny) == true){
- //LicznikIfow++;
- iss>>obecny;
- rozmiar = obecny.length();
- //for(int i = 0; i < rozmiar; i++)
- if(CzyOperator(obecny) == false && CzyNawiasZam(obecny) == false){
- counter++;
- }
- }
- //cout<<"Program wszedl do "<< LicznikIfow << " ifow"<<endl;
- //LicznikIfow = 0;
- }
- return counter;
- }
- int bledne_nawiasy(string s)
- {
- Znak *pom;
- int check = 0;
- StosZnakow Stos;
- string obecny,pomoc;
- istringstream iss(s);
- while(iss>>obecny){
- if(obecny == "[" || obecny == "(" || obecny == "{"){
- Stos.push(obecny);
- }
- if(obecny == "]" || obecny == ")" || obecny == "}"){
- if(Stos.isEmpty() == false){
- pom = Stos.pop();
- if(obecny == "]"){
- if(pom->znak != "["){
- check++;
- }
- }
- if(obecny == ")"){
- if(pom->znak != "("){
- check++;
- }
- }
- if(obecny == "}"){
- if(pom->znak != "{"){
- check++;
- }
- }
- }else{
- check++;
- }
- }
- }
- return check;
- }
- int Prior(string o)
- {
- if(o == "+" || o == "~")
- return 1;
- if(o == "*" || o == "d" || o == "m")
- return 2;
- else
- return 3;
- }
- string To_ONP(string s)
- {
- StosZnakow Stos;
- istringstream iss(s);
- string obecny;
- string wyjscie = "";
- string pomoc;
- Znak* roboczy;
- Znak* roboczyDoWyjscia;
- int licznik = 0;
- while(iss>>obecny){
- licznik++;
- if(CzyLiczba(obecny) == true){ //Czy jest liczba
- wyjscie = wyjscie + " " + obecny;
- }
- if(CzyOperator(obecny) == true){ // czy jest operatorem
- if(Stos.isEmpty() == true || CzyNawiasOt(Stos.top())){ //stos jest pusty lub zawiera lewy nawias
- Stos.push(obecny);
- }else{ //na stosie cos jest
- if(Prior(Stos.top()) < Prior(obecny)){ // badanie priorytetu
- Stos.push(obecny);
- }
- else if(Prior(Stos.top()) >= Prior(obecny)){
- while(Stos.isEmpty() == false && (Prior(obecny) <= Prior(Stos.top()) && CzyNawiasOt(Stos.top()) == false) ){
- roboczy = Stos.pop();
- wyjscie = wyjscie + " " + roboczy->znak;
- }
- Stos.push(obecny);
- }
- }
- }else
- if(CzyNawiasOt(obecny) == true){
- Stos.push(obecny);
- }else
- if(CzyNawiasZam(obecny) == true){
- roboczyDoWyjscia = Stos.pop();
- while(CzyNawiasOt(roboczyDoWyjscia->znak) != true) {
- if(CzyNawias(roboczyDoWyjscia->znak) != true){
- wyjscie = wyjscie + " " + roboczyDoWyjscia->znak;
- roboczyDoWyjscia = Stos.pop();
- }
- else{
- roboczyDoWyjscia = Stos.pop();
- }
- }
- }
- }
- while(Stos.isEmpty() == false){
- roboczyDoWyjscia = Stos.pop();
- wyjscie = wyjscie + " " + roboczyDoWyjscia->znak;
- }
- //cout<<"Wynik ONP: "<<wyjscie<<endl;
- return wyjscie;
- }
- int RzutowanieNaInt(string s)
- {
- int wynik;
- istringstream iss(s);
- iss>>wynik;
- return wynik;
- }
- string LiczONP(string s)
- {
- StosZnakow Stos;
- istringstream iss(s);
- ostringstream ss;
- string obecny,temp;
- Znak * a;
- Znak * b;
- int wynik,roboczy, check = 0;
- while(iss>>obecny){
- ss.str("");
- if(CzyLiczba(obecny) == true){
- Stos.push(obecny);
- }
- else{
- a = Stos.pop();
- b = Stos.pop();
- //cout<<"Stos po pobraniu elementow: ";
- if(obecny == "+"){
- wynik = RzutowanieNaInt(b->znak) + RzutowanieNaInt(a->znak);
- ss << wynik;
- //cout<< "Wynik dodawania: "<<wynik<<endl;
- temp = ss.str();
- //cout<<"String po konwersji:"<< temp <<endl;
- Stos.push(temp);
- //cout<<"Stos po dodawaniu: ";
- //Stos.wyswietl();
- //cout<<endl;
- }else{
- if(obecny == "~"){
- wynik = RzutowanieNaInt(b->znak) - RzutowanieNaInt(a->znak);
- ss << wynik;
- temp = ss.str();
- Stos.push(temp);
- }else{
- if(obecny == "*"){
- wynik = RzutowanieNaInt(b->znak) * RzutowanieNaInt(a->znak);
- ss << wynik;
- temp = ss.str();
- Stos.push(temp);
- }else
- if(obecny == "d"){
- if(RzutowanieNaInt(a->znak) <= 0){ // dzielenie przez 0
- check++; //WA¯NE ! ! ! ! !! ! ! ! : Sprawdzic czy nie musi byc: a->znak <= 0
- return "bledne dzialanie";
- }
- else{
- wynik = RzutowanieNaInt(b->znak) / RzutowanieNaInt(a->znak);
- ss << wynik;
- temp = ss.str();
- Stos.push(temp);
- }
- }else{
- if(obecny == "m"){
- if(RzutowanieNaInt(b->znak) < 0 || RzutowanieNaInt(a->znak) <= 0){ //modulo z zerem.
- check++;
- return "bledne dzialanie";
- }
- else{
- wynik = RzutowanieNaInt(b->znak) % RzutowanieNaInt(a->znak);
- ss << wynik;
- temp = ss.str();
- Stos.push(temp);
- }
- }else
- if(obecny == "^"){
- if( (RzutowanieNaInt(a->znak) < 0) || ( a->znak == "0" && b->znak == "0") ){ //ujemny wykladnik potegi lub 0 do potegi 0
- check++;
- return "bledne dzialanie";
- }
- else{
- wynik = pow(RzutowanieNaInt(b->znak),RzutowanieNaInt(a->znak));
- ss << wynik;
- temp = ss.str();
- Stos.push(temp);
- }
- }
- }
- }
- }
- }
- }
- a = Stos.pop();
- return a->znak;
- }
- int main()
- {
- //std::ios::sync_with_stdio(false);
- int n,check;
- string s,ss,wynik;
- cin>>n;
- cin.ignore(60013*2+1, '\n');
- getline(cin,s);
- //int check = bledne_nawiasy(s);
- //cout<<"wynik: "<<check<<endl;
- if(bledne_nawiasy(s) != 0){
- cout<<"bledne nawiasy"<<endl;
- return 0;
- }
- //else
- //cout<<"przeszlo nawiasy"<<endl;
- //check = bledna_skladnia(s);
- if(bledna_skladnia(s) != 0){
- cout<<"bledna skladnia"<<endl;
- //cout<<"Ilosc bledow: "<<check<<endl;
- return 0;
- }
- //else
- //cout<<"przeszlo skladnie"<<endl;
- // test(s);
- ss = To_ONP(s);
- wynik = LiczONP(ss);
- if(wynik != "bledne dzialanie"){
- long long int wynik2 = RzutowanieNaInt(wynik);
- cout<<wynik2<<endl;
- }
- else
- cout<<wynik<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement