Advertisement
Heretiiik

stack.cpp

Apr 5th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4.  
  5. // šablona pro třídu, bude funguvat s jakýmkoli typem (int, double), strukturou, třídou;
  6. template<class T>
  7. class zasobnik {
  8. public:
  9.     // konstruktor, vytvoří prázdný zásobník
  10.     zasobnik() : front(nullptr),count(0) {};
  11.     // konstruktor, vytovří zásobník s 1 prvkem
  12.     zasobnik(const T & in) : front(new elemType(in)),count(1) {};
  13.     // vrací true pokud je zásobník prázdný
  14.     bool empty() const {
  15.         return (front == nullptr) ? true : false;
  16.     };
  17.     // vrací počet prvnků v zásobníku
  18.     size_t size() const {
  19.         return count;
  20.     };
  21.     // vrací referenci (ukazatel) na první prvek zásobníku
  22.     T & top() {
  23.         if (front == nullptr)
  24.             throw "Empty!";
  25.         return *front;
  26.     };
  27.     void push(const T & in) {
  28.         if (front == nullptr)
  29.             front = new elemType(in);
  30.         else {
  31.             elemType * tmp = new elemType(in);
  32.             tmp->next = front;
  33.             front = tmp;
  34.         }
  35.         ++count;
  36.     };
  37.     T pop() {
  38.         if (front == nullptr)
  39.             throw "Empty!";
  40.         T tmp = front->data;
  41.         elemType*tmpp = front->next;
  42.         delete front;
  43.         front = tmpp;
  44.         --count;
  45.         return tmp;
  46.     };
  47.  
  48.     typedef T value_type;
  49. private:
  50.     struct elemType {
  51.         T data;
  52.         elemType * next;
  53.         elemType() : next(nullptr) {};
  54.         elemType(const T & in) : data(in), next(nullptr) {};
  55.         elemType(const T & in,const T * n) : data(in), next(n) {};
  56.     };
  57.     elemType * front;
  58.     size_t count;
  59.  
  60. };
  61.  
  62. // ------------------------------------------------------------------
  63. // neobjektová implementace zasobníku
  64.  
  65. // šablona pro jednotlive elelmenty zásobníku (vagónky), T je typ nákladu, může btý jakýkoli
  66. template<class T>
  67. struct elemType {
  68.     T data;             // náklad
  69.     elemType * next;    // další vagon
  70.     elemType() : next(nullptr) {};      // vytvoří prázdný vagón
  71.     elemType(const T & in) : data(in), next(nullptr) {};    // vytvoří vagon s nákladem, bez zádného který by ho následoval
  72.     elemType(const T & in,elemType * n) : data(in), next(n) {};  // vytvoří vago ns nákladem a určí jaký vagon bude následovat
  73. };
  74.  
  75. // šablona pro přidání vagonku do vlaku, T je typ nákladu, může btý jakýkoli
  76. template<class T>
  77. // ano je tam ukazatel na ukazatel, ale takhle se to dělá :D
  78. void push(elemType<T> ** front, const T & in) {
  79.     // vlak je prázdný, vyrobíme vagon a čau
  80.     if (*front == nullptr)
  81.         *front = new elemType<T>(in);
  82.     // něco už ve valku připojíme na začátek
  83.     else {
  84.         // vytvoří vagon, s náklem (in) a bude ho následovat ten co byl doteď první
  85.         elemType<T> * tmp = new elemType<T>(in,*front);
  86.         // začátek valku bude na našem novém vagonu
  87.         *front = tmp;
  88.     }
  89. }
  90.  
  91. // vyjme první vagon
  92. template<class T>
  93. T pop(elemType<T> ** front) {
  94.     // vlak je prázdný, nemám co vracet, hodím chybu
  95.     if (*front == nullptr)
  96.         throw "Empty!";
  97.     // toto si uchovám, to je můj náklad který chci
  98.     T tmp = (*front)->data;
  99.     // zapamatuju si, který vagon ude nově první
  100.     elemType<T> * tmpp = (*front)->next;
  101.     // odstraním vyložený vagon
  102.     delete *front;
  103.     // určím nový první
  104.     *front = tmpp;
  105.     // vrátím náklad
  106.     return tmp;
  107. }
  108.  
  109. template<class T>
  110. bool empty(const elemType<T> * front) {
  111.     return (front == nullptr) ? true : false;
  112. }
  113.  
  114.  
  115.  
  116. int main()
  117. {
  118.     // prázdný zásobník (vlak)
  119.  
  120.     elemType<int> * s = nullptr;
  121.     for(int i = 0; i <= 5; i++){
  122.         push(&s,i);
  123.     }
  124.     printf("Vypisuju:\n");
  125.     while (!empty(s))
  126.         printf("%d\n",pop(&s));
  127.  
  128.         return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement