Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <cstring>
  4. #include <math.h>
  5. #include <string>
  6.  
  7.  
  8. using namespace std;
  9.  
  10.  
  11. struct Znak
  12. {
  13.     string znak;
  14.     Znak *next;
  15.     Znak(string znak)
  16.     {
  17.         this->znak=znak;
  18.         next=NULL;
  19.     }
  20. };
  21.  
  22. class StosZnakow
  23. {
  24. public:
  25.     Znak *first;
  26.     int size;
  27.  
  28.     StosZnakow()
  29.     {
  30.         first=NULL;
  31.         size=0;
  32.     }
  33.  
  34.     void push(string znak)
  35.     {
  36.         Znak *temp = new Znak(znak);
  37.         temp->next=first;
  38.         first=temp;
  39.         size++;
  40.     }
  41.  
  42.     Znak* pop()
  43.     {
  44.         if(first==NULL)
  45.             return NULL;
  46.         else
  47.         {
  48.             Znak *temp=first;
  49.             first=first->next;
  50.             size--;
  51.             return temp;
  52.         }
  53.     }
  54.  
  55.     bool isEmpty()
  56.     {
  57.         if(size==0)
  58.             return true;
  59.         else
  60.             return false;
  61.     }
  62.  
  63.     void wyswietl()
  64.     {
  65.         Znak *temp=first;
  66.         if(temp==NULL)
  67.             cout << "stos pusty";
  68.         else
  69.         {
  70.             while(temp!=NULL)
  71.             {
  72.                 cout << temp->znak;
  73.                 temp=temp->next;
  74.             }
  75.         }
  76.     }
  77.     string top()
  78.     {
  79.         Znak *roboczy = first;
  80.         if (roboczy == NULL)
  81.             cout << "";
  82.         else
  83.         {
  84.             return roboczy->znak;
  85.  
  86.         }
  87.     }
  88. };
  89.  
  90.  
  91. //string s(" ( 3 + ( 2 * 4 ) ) ");
  92. //string ss("[ ( 1 + 1243 ] )");
  93. //string ssss("( 1 ) )");
  94. //istringstream iss(s);
  95.  
  96. void toONP_String(string s)
  97. {
  98.     string part;
  99.     string a,c,pom;
  100.  
  101.     istringstream iss(s,istringstream::in);
  102.     iss>>c;
  103.     if(c == "(" || c== "["){
  104.     //if(strcmp(c,pom1) == 0 || strcmp(c,pom2) == 0){
  105.         toONP_String(s);
  106.         iss>>a;
  107.         toONP_String(s);
  108.         iss>>pom;
  109.         cout<<a;
  110.        }
  111.        else{
  112.         cout<<c;
  113.         //getline(cin,sss);
  114.        }
  115. }
  116.  
  117.  
  118.  
  119.  
  120. bool CzyNawias(string obecny)
  121. {
  122.     if(obecny == "[" || obecny == "(" || obecny == "{" || obecny == "]" || obecny == ")" || obecny == "}")
  123.         return true;
  124.     else
  125.         return false;
  126. }
  127.  
  128. bool CzyNawiasOt(string obecny)
  129. {
  130.     if(obecny == "[" || obecny == "(" || obecny == "{")
  131.         return true;
  132.     else
  133.         return false;
  134. }
  135.  
  136. bool CzyNawiasZam(string obecny)
  137. {
  138.     if(obecny == "]" || obecny == ")" || obecny == "}")
  139.         return true;
  140.     else
  141.         return false;
  142. }
  143.  
  144. bool CzyLiczba(string obecny)
  145. {
  146.     if(isdigit(obecny.at(0)) == true || obecny.at(0) == '-')
  147.         return true;
  148.     else
  149.         return false;
  150. }
  151.  
  152. bool CzyOperator(string obecny)
  153. {
  154.     if(CzyNawiasOt(obecny) == false && CzyNawiasZam(obecny) == false && isdigit(obecny.at(0)) == false && obecny.at(0) != '-')
  155.         return true;
  156.     else
  157.         return false;
  158. }
  159.  
  160. int bledna_skladnia(string s)
  161. {
  162.     StosZnakow Stos;
  163.     istringstream iss(s);
  164.     string obecny;
  165.     int counter = 0;
  166.     int LicznikObrotow = 0;
  167.     //int LicznikIfow = 0;
  168.     int rozmiar;
  169.     iss>>obecny;
  170.     while(!iss.eof()){
  171.         LicznikObrotow++;
  172.         if(CzyLiczba(obecny) == true){   // liczba po liczbie ( dwie liczby obok siebie)
  173.             //LicznikIfow++;
  174.             iss>>obecny;
  175.             rozmiar = obecny.length();
  176.             //for(int i = 0; i < rozmiar; i++)
  177.  
  178.             if(CzyLiczba(obecny) == true ){
  179.                 counter++;
  180.             }
  181.         }else
  182.         if(CzyNawiasOt(obecny) == true){
  183.             //LicznikIfow++;
  184.             iss>>obecny;
  185.             rozmiar = obecny.length();
  186.             //for(int i = 0; i < rozmiar; i++)
  187.  
  188.             if(CzyLiczba(obecny) == false && CzyNawiasOt(obecny) == false){
  189.                 counter++;
  190.             }
  191.         }else
  192.         if(CzyOperator(obecny) == true){  //jest operatorem
  193.             //LicznikIfow++;
  194.             iss>>obecny;
  195.             rozmiar = obecny.length();
  196.             //for(int i = 0; i < rozmiar; i++)
  197.  
  198.             if((CzyLiczba(obecny) == false && CzyNawiasOt(obecny) == false) || LicznikObrotow == 1){
  199.                 counter++;
  200.             }
  201.         }else
  202.         if(CzyNawiasZam(obecny) == true){
  203.             //LicznikIfow++;
  204.             iss>>obecny;
  205.             rozmiar = obecny.length();
  206.             //for(int i = 0; i < rozmiar; i++)
  207.             if(CzyOperator(obecny) == false && CzyNawiasZam(obecny) == false){
  208.                 counter++;
  209.             }
  210.         }
  211.         //cout<<"Program wszedl do "<< LicznikIfow << " ifow"<<endl;
  212.         //LicznikIfow = 0;
  213.     }
  214.  
  215.     return counter;
  216. }
  217.  
  218. int bledne_nawiasy(string s)
  219. {
  220.     Znak *pom;
  221.     int check = 0;
  222.     StosZnakow Stos;
  223.     string obecny,pomoc;
  224.  
  225.  
  226.     istringstream iss(s);
  227.     while(iss>>obecny){
  228.         if(obecny == "[" || obecny == "(" || obecny == "{"){
  229.             Stos.push(obecny);
  230.         }
  231.         if(obecny == "]" || obecny == ")" || obecny == "}"){
  232.             if(Stos.isEmpty() == false){
  233.                pom = Stos.pop();
  234.             if(obecny == "]"){
  235.                 if(pom->znak != "["){
  236.                     check++;
  237.                 }
  238.             }
  239.             if(obecny == ")"){
  240.                 if(pom->znak != "("){
  241.                     check++;
  242.                 }
  243.             }
  244.             if(obecny == "}"){
  245.                 if(pom->znak != "{"){
  246.                     check++;
  247.                 }
  248.             }
  249.             }else{
  250.                 check++;
  251.                 }
  252.  
  253.         }
  254.  
  255.     }
  256.     return check;
  257. }
  258.  
  259.  
  260. int Prior(string o)
  261. {
  262.     if(o == "+" || o == "~")
  263.         return 1;
  264.     if(o == "*" || o == "d" || o == "m")
  265.         return 2;
  266.     else
  267.         return 3;
  268. }
  269.  
  270.  
  271.  
  272.  
  273. string To_ONP(string s)
  274. {
  275.     StosZnakow Stos;
  276.     istringstream iss(s);
  277.     string obecny;
  278.     string wyjscie = "";
  279.     string pomoc;
  280.     Znak* roboczy;
  281.     Znak* roboczyDoWyjscia;
  282.  
  283.     int licznik = 0;
  284.     while(iss>>obecny){
  285.         licznik++;
  286.         if(CzyLiczba(obecny) == true){  //Czy jest liczba
  287.             wyjscie = wyjscie + " " + obecny;
  288.         }
  289.         if(CzyOperator(obecny) == true){ // czy jest operatorem
  290.             if(Stos.isEmpty() == true || CzyNawiasOt(Stos.top())){    //stos jest pusty lub zawiera lewy nawias
  291.                 Stos.push(obecny);
  292.             }else{                          //na stosie cos jest
  293.  
  294.             if(Prior(Stos.top()) < Prior(obecny)){  // badanie priorytetu
  295.                 Stos.push(obecny);
  296.             }
  297.             else if(Prior(Stos.top()) >= Prior(obecny)){
  298.  
  299.                 while(Stos.isEmpty() == false && (Prior(obecny) <= Prior(Stos.top()) && CzyNawiasOt(Stos.top()) == false) ){
  300.                     roboczy = Stos.pop();
  301.                     wyjscie = wyjscie + " " + roboczy->znak;
  302.                 }
  303.                 Stos.push(obecny);
  304.             }
  305.  
  306.                 }
  307.         }else
  308.         if(CzyNawiasOt(obecny) == true){
  309.             Stos.push(obecny);
  310.         }else
  311.         if(CzyNawiasZam(obecny) == true){
  312.             roboczyDoWyjscia = Stos.pop();
  313.             while(CzyNawiasOt(roboczyDoWyjscia->znak) != true)   {
  314.                 if(CzyNawias(roboczyDoWyjscia->znak) != true){
  315.                     wyjscie = wyjscie + " " + roboczyDoWyjscia->znak;
  316.                     roboczyDoWyjscia = Stos.pop();
  317.                     }
  318.                 else{
  319.                     roboczyDoWyjscia = Stos.pop();
  320.                 }
  321.                 }
  322.         }
  323.  
  324.  
  325.  
  326.     }
  327.     while(Stos.isEmpty() == false){
  328.         roboczyDoWyjscia = Stos.pop();
  329.         wyjscie = wyjscie + " " + roboczyDoWyjscia->znak;
  330.     }
  331.     //cout<<"Wynik ONP: "<<wyjscie<<endl;
  332.     return wyjscie;
  333. }
  334.  
  335.  
  336. int RzutowanieNaInt(string s)
  337. {
  338.     int wynik;
  339.     istringstream iss(s);
  340.     iss>>wynik;
  341.     return wynik;
  342. }
  343.  
  344.  
  345. string LiczONP(string s)
  346. {
  347.     StosZnakow Stos;
  348.     istringstream iss(s);
  349.     ostringstream ss;
  350.     string obecny,temp;
  351.     Znak * a;
  352.     Znak * b;
  353.     int wynik,roboczy, check = 0;
  354.     while(iss>>obecny){
  355.         ss.str("");
  356.         if(CzyLiczba(obecny) == true){
  357.             Stos.push(obecny);
  358.         }
  359.         else{
  360.             a = Stos.pop();
  361.             b = Stos.pop();
  362.             //cout<<"Stos po pobraniu elementow: ";
  363.             if(obecny == "+"){
  364.                 wynik = RzutowanieNaInt(b->znak) + RzutowanieNaInt(a->znak);
  365.  
  366.                 ss << wynik;
  367.                 //cout<< "Wynik dodawania: "<<wynik<<endl;
  368.                 temp = ss.str();
  369.                 //cout<<"String po konwersji:"<< temp <<endl;
  370.                 Stos.push(temp);
  371.                 //cout<<"Stos po dodawaniu: ";
  372.                 //Stos.wyswietl();
  373.                 //cout<<endl;
  374.             }else{
  375.  
  376.  
  377.             if(obecny == "~"){
  378.                 wynik = RzutowanieNaInt(b->znak) - RzutowanieNaInt(a->znak);
  379.  
  380.                 ss << wynik;
  381.                 temp = ss.str();
  382.                 Stos.push(temp);
  383.             }else{
  384.  
  385.             if(obecny == "*"){
  386.                 wynik = RzutowanieNaInt(b->znak) * RzutowanieNaInt(a->znak);
  387.  
  388.                 ss << wynik;
  389.                 temp = ss.str();
  390.                 Stos.push(temp);
  391.  
  392.             }else
  393.  
  394.             if(obecny == "d"){
  395.                 if(RzutowanieNaInt(a->znak) <= 0){  // dzielenie przez 0
  396.                     check++;         //WA¯NE ! ! ! ! !! ! ! ! : Sprawdzic czy nie musi byc: a->znak <= 0
  397.                     return "bledne dzialanie";
  398.                 }
  399.                 else{
  400.                     wynik = RzutowanieNaInt(b->znak) / RzutowanieNaInt(a->znak);
  401.  
  402.                     ss << wynik;
  403.                     temp = ss.str();
  404.                     Stos.push(temp);
  405.                 }
  406.  
  407.             }else{
  408.  
  409.             if(obecny == "m"){
  410.                 if(RzutowanieNaInt(b->znak) < 0 || RzutowanieNaInt(a->znak) <= 0){    //modulo z zerem.
  411.                     check++;
  412.                     return "bledne dzialanie";
  413.                 }
  414.                 else{
  415.                     wynik = RzutowanieNaInt(b->znak) % RzutowanieNaInt(a->znak);
  416.  
  417.                     ss << wynik;
  418.                     temp = ss.str();
  419.                     Stos.push(temp);
  420.                 }
  421.  
  422.             }else
  423.  
  424.             if(obecny == "^"){
  425.                 if( (RzutowanieNaInt(a->znak) < 0) || ( a->znak == "0" && b->znak == "0") ){     //ujemny wykladnik potegi lub 0 do potegi 0
  426.                     check++;
  427.                     return "bledne dzialanie";
  428.                 }
  429.                 else{
  430.                     wynik = pow(RzutowanieNaInt(b->znak),RzutowanieNaInt(a->znak));
  431.                     ss << wynik;
  432.                     temp = ss.str();
  433.                     Stos.push(temp);
  434.                 }
  435.  
  436.             }
  437.  
  438.         }
  439.             }
  440.         }
  441.         }
  442.  
  443.     }
  444.  
  445.             a = Stos.pop();
  446.             return a->znak;
  447.  
  448.  
  449. }
  450.  
  451.  
  452.  
  453. int main()
  454. {
  455.     //std::ios::sync_with_stdio(false);
  456.  
  457.     int n,check;
  458.     string s,ss,wynik;
  459.     cin>>n;
  460.     cin.ignore(60013*2+1, '\n');
  461.     getline(cin,s);
  462.     //int check = bledne_nawiasy(s);
  463.     //cout<<"wynik: "<<check<<endl;
  464.     if(bledne_nawiasy(s) != 0){
  465.         cout<<"bledne nawiasy"<<endl;
  466.         return 0;
  467.     }
  468.     //else
  469.         //cout<<"przeszlo nawiasy"<<endl;
  470.     //check = bledna_skladnia(s);
  471.     if(bledna_skladnia(s) != 0){
  472.         cout<<"bledna skladnia"<<endl;
  473.         //cout<<"Ilosc bledow: "<<check<<endl;
  474.         return 0;
  475.     }
  476.     //else
  477.         //cout<<"przeszlo skladnie"<<endl;
  478.  
  479.  
  480.    // test(s);
  481.  
  482.     ss = To_ONP(s);
  483.     wynik = LiczONP(ss);
  484.     if(wynik != "bledne dzialanie"){
  485.         long long int wynik2 = RzutowanieNaInt(wynik);
  486.         cout<<wynik2<<endl;
  487.     }
  488.     else
  489.         cout<<wynik<<endl;
  490.  
  491.  
  492.     return 0;
  493. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement