Advertisement
Neveles

Untitled

Mar 4th, 2020
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #pragma once
  2. #include "Stack.h"
  3.  
  4. template <class T>
  5. class StackList : public Stack<T>
  6. {
  7. public:
  8.     StackList();
  9.     StackList(const StackList<T>& src);
  10.     virtual ~StackList() { clear(); }
  11.  
  12.     void push(const T& e);
  13.     void push_front(T data);
  14.     const T& pop();
  15.     bool isEmpty() { return top_ == 0; }
  16.     void clear();
  17.     int getSize();
  18. private:
  19.     struct Node
  20.     {
  21.         Node* next_;
  22.         Node* prev_;
  23.         T value_;
  24.  
  25.         Node(T data = T(), Node* next = nullptr, Node* prev = nullptr)
  26.         {
  27.             this->value_ = data;
  28.             this->next_ = next;
  29.             this->prev_ = prev;
  30.         }
  31.     };
  32.     int size_;
  33.     Node* head_;
  34.     int top_ = 0;
  35. };
  36.  
  37. //конструктор
  38. template <class T>
  39. StackList<T>::StackList()
  40. {
  41.     size_ = 0;
  42.     head_ = nullptr;
  43.     top_ = 0;
  44. }
  45.  
  46. //конструктор копирования
  47. template<class T>
  48. StackList<T>::StackList(const StackList<T>& src)
  49. {
  50.     size_ = src.size_;
  51.     head_ = new Node(src.head_->value_, nullptr, nullptr);
  52.     Node* unit1 = head_;
  53.     Node* unit2 = src.head_;
  54.     for (int i = 1; i < size_; i++)
  55.     {
  56.         unit2 = unit2->next_;
  57.         unit1->next_ = new Node(unit2->value_, nullptr, unit1);
  58.         unit1 = unit1->next_;
  59.     }
  60.     top_ = src.top_;
  61. }
  62.  
  63. template<class T>
  64. void StackList<T>::push(const T& e)
  65. {
  66.     top_++;
  67.     push_front(e);
  68. }
  69.  
  70. template<class T>
  71. void StackList<T>::push_front(T data)
  72. {
  73.     head_ = new Node(data, head_);
  74.     size_++;
  75. }
  76.  
  77. template<class T>
  78. const T& StackList<T>::pop()
  79. {
  80.     if (top_ == 0)
  81.     {
  82.         throw StackUnderflow();
  83.     }
  84.     Node* temp = head_;
  85.     head_ = head_->next_;
  86.     size_--;
  87.     top_--;
  88.     T result = temp->value_;
  89.     delete temp;
  90.     return result;
  91. }
  92.  
  93. template<class T>
  94. void StackList<T>::clear()
  95. {
  96.     while (size_)
  97.     {
  98.         Node* unit = head_;
  99.         head_ = head_->next_;
  100.         delete unit;
  101.         size_--;;
  102.     }
  103. }
  104.  
  105. template<class T>
  106. int StackList<T>::getSize()
  107. {
  108.     return size_;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement