Advertisement
Guest User

StackCalculator.cpp

a guest
Jan 21st, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.38 KB | None | 0 0
  1. #ifndef STACKCALCULATOR_H_INCLUDED
  2. #define STACKCALCULATOR_H_INCLUDED
  3. #endif // STACKCALCULATOR_H_INCLUDED
  4. enum operacja
  5. {
  6.     ADD='+',SUB='-',MUL='*',DIV='/',NEG='~',REV='R',INP='I'
  7. };
  8. template <typename T> class StackCalculator
  9. {
  10.     struct Element
  11.     {
  12.         T wartosc;
  13.         operacja znak;
  14.         Element *nastepny;
  15.     };
  16.     Element *koniec;
  17. void rekurencja(Element* temp)
  18.         {
  19.             if(temp==NULL)
  20.             {
  21.                 cout<<endl<<"Stack: [";
  22.             }
  23.             else
  24.             {
  25.                 rekurencja(temp->nastepny);
  26.                 if(temp->znak==INP)
  27.                 {
  28.                     cout<<temp->wartosc<<",";
  29.                 }
  30.                 else
  31.                 {
  32.                     cout<<(char)temp->znak<<",";
  33.                 }
  34.             }
  35.         }
  36. //konstruktor
  37. public:
  38.     StackCalculator(T wartosc, operacja znak)
  39.     {
  40.         struct Element *nowy = new Element;
  41.         nowy->wartosc = wartosc;
  42.         nowy->znak=znak;
  43.         nowy->nastepny = NULL;
  44.         koniec = nowy;
  45.     };
  46.     StackCalculator()
  47.     {
  48.         koniec =NULL;
  49.     };
  50.  
  51.     ~StackCalculator()
  52.     {
  53.         Element* temp;
  54.         while(koniec!=NULL)
  55.         {
  56.             temp=koniec;
  57.             koniec=koniec->nastepny;
  58.             delete temp;
  59.         }
  60.     };
  61.     void usunStos()
  62.     {
  63.         Element* temp;
  64.         while(koniec!=NULL)
  65.         {
  66.             temp=koniec;
  67.             koniec=koniec->nastepny;
  68.             delete temp;
  69.         }
  70.     }
  71.     void usunOstatni()
  72.     {
  73.         if(koniec!=NULL)
  74.         {
  75.             Element *temp;
  76.             temp=koniec;
  77.             koniec=koniec->nastepny;
  78.             delete temp;
  79.         }
  80.     }
  81.     void wyswietl()
  82.     {
  83.         rekurencja(koniec);
  84.         cout<<"]";
  85.     }
  86.  
  87.  
  88.     void wstaw(T wartosc, operacja znak)
  89.     {
  90.         struct Element *nowy = new Element;
  91.         nowy->wartosc = wartosc;
  92.         nowy->znak=znak;
  93.         nowy->nastepny = koniec;
  94.         koniec = nowy;
  95.     };
  96.     bool pusty()
  97.     {
  98.         if(koniec==NULL)
  99.         {
  100.             return true;
  101.         }
  102.         else
  103.         {
  104.             return false;
  105.         }
  106.  
  107.     }
  108.     Element* pobierz()
  109.     {
  110.         if(koniec==NULL)
  111.         {
  112.             cout<<endl<<"Koniec stosu";
  113.             return NULL;
  114.         }
  115.         else
  116.         {
  117.             Element* a = koniec;
  118.             struct Element *tymczasowa = koniec->nastepny;
  119.             koniec=NULL;
  120.             delete koniec;
  121.             koniec = tymczasowa;
  122.             return a;
  123.         }
  124.     };
  125.     T wykonaj(Element *wykonanie, bool &blad)
  126.     {
  127.         if (wykonanie==NULL)
  128.         {
  129.             blad=true;
  130.         }
  131.         else
  132.         {
  133.             switch (wykonanie->znak)
  134.             {
  135.             case INP:
  136.                 {
  137.                     if(wykonanie->nastepny!=NULL)
  138.                     {
  139.                         blad=true;
  140.                     }
  141.                     else
  142.                     {
  143.                         blad=false;
  144.                     }
  145.                     return wykonanie->wartosc;
  146.                 }
  147.             break;
  148.             case ADD:
  149.                 {
  150.                     return wykonaj(pobierz(),blad)+wykonaj(pobierz(),blad);
  151.                 }
  152.                 break;
  153.             case SUB:
  154.                 {
  155.                     T wartosc1 = wykonaj(pobierz(),blad);
  156.                     T wartosc2 = wykonaj(pobierz(),blad);
  157.                     return wartosc2-wartosc1;
  158.                 }
  159.                 break;
  160.             case MUL:
  161.                 {
  162.                     return wykonaj(pobierz(),blad)*wykonaj(pobierz(),blad);
  163.                 }
  164.                 break;
  165.             case DIV:
  166.                 {
  167.                     T wartosc1 = wykonaj(pobierz(),blad);
  168.                     T wartosc2 = wykonaj(pobierz(),blad);
  169.                     return wartosc2/wartosc1;}
  170.                 break;
  171.             /*case REV:
  172.                 {
  173.                     return !wykonaj(pobierz(),blad));
  174.                 }
  175.                 break;*/
  176.             case NEG:
  177.                 {
  178.                     return wykonaj(pobierz(),blad)*(-1);
  179.                 }
  180.                 break;
  181.             /*case POT:
  182.                 {
  183.                     return
  184.                 }
  185.                 break;
  186.             */
  187.             }
  188.         }
  189.     }
  190.  
  191. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement