Advertisement
chevengur

СПРИНТ № 5 | Стек, очередь, дек | Урок 2: Стек 2/3

Feb 14th, 2024
1,124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. template <typename It>
  9. void PrintRange(It range_begin, It range_end) {
  10.     for (auto it = range_begin; it != range_end; ++it) {
  11.         cout << *it << " "s;
  12.     }
  13.     cout << endl;
  14. }
  15.  
  16. template <typename Type>
  17. class Stack {
  18. public:
  19.     void Push(const Type& element) {
  20.         elements_.push_back(element);
  21.     }
  22.     void Pop() {
  23.         elements_.pop_back();
  24.     }
  25.     const Type& Peek() const {
  26.         return elements_.back();
  27.     }
  28.     Type& Peek() {
  29.         return elements_.back();
  30.     }
  31.     void Print() const {
  32.         PrintRange(elements_.begin(), elements_.end());
  33.     }
  34.     uint64_t Size() const {
  35.         return elements_.size();
  36.     }
  37.     bool IsEmpty() const {
  38.         return elements_.empty();
  39.     }
  40.  
  41. private:
  42.     vector<Type> elements_;
  43. };
  44.  
  45. // используем струкруту из элемента
  46. // и минимума в стеке до дна стека до текущего элемента включительно
  47. template <typename Type>
  48. struct PairWithMin {
  49.     Type element;
  50.     Type minimum;
  51. };
  52.  
  53. template <typename Type>
  54. ostream& operator<<(ostream& out, const PairWithMin<Type>& pair_to_print) {
  55.     // будем выводить только сам элемент, выводить минимум не будем
  56.     out << pair_to_print.element;
  57.     return out;
  58. }
  59.  
  60. template <typename Type>
  61. class StackMin {
  62. public:
  63.     void Push(const Type& new_element) {
  64.         PairWithMin<Type> new_pair = {new_element, new_element};
  65.         if (!elements_.IsEmpty() && new_pair.minimum > elements_.Peek().minimum) {
  66.             new_pair.minimum = elements_.Peek().minimum;
  67.         }
  68.         elements_.Push(new_pair);
  69.     }
  70.     void Pop() {
  71.         elements_.Pop();
  72.     }
  73.     const Type& Peek() const {
  74.         return elements_.Peek().element;
  75.     }
  76.     Type& Peek() {
  77.         return elements_.Peek().element;
  78.     }
  79.     void Print() const {
  80.         elements_.Print();
  81.     }
  82.     uint64_t Size() const {
  83.         return elements_.size();
  84.     }
  85.     bool IsEmpty() const {
  86.         return elements_.IsEmpty();
  87.     }
  88.     const Type& PeekMin() const {
  89.         return elements_.Peek().minimum;
  90.     }
  91.     Type& PeekMin() {
  92.         return elements_.Peek().minimum;
  93.     }
  94.  
  95. private:
  96.     Stack<PairWithMin<Type>> elements_;
  97. };
  98.  
  99. int main() {
  100.     StackMin<int> stack;
  101.     vector<int> values(5);
  102.  
  103.     // заполняем вектор для тестирования нашего стека
  104.     iota(values.begin(), values.end(), 1);
  105.     // перемешиваем значения
  106.     random_shuffle(values.begin(), values.end());
  107.  
  108.     // заполняем стек
  109.     for (int i = 0; i < 5; ++i) {
  110.         stack.Push(values[i]);
  111.     }
  112.  
  113.     // печатаем стек и его минимум, постепенно убирая из стека элементы
  114.     while (!stack.IsEmpty()) {
  115.         stack.Print();
  116.         cout << "Минимум = "s << stack.PeekMin() << endl;
  117.         stack.Pop();
  118.     }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement