nochnoikoshmar1

Untitled

Apr 20th, 2023
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. #include <cmath>
  2. #include <map>
  3. #include <string>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <set>
  7. #include <utility>
  8. #include <vector>
  9. #include <numeric>
  10. #include <chrono>
  11. #include <type_traits>
  12. #include <cassert>
  13. #include <sstream>
  14. #include <unordered_map>
  15. #include <stdexcept>
  16. #include <stack>
  17. #include <iterator>
  18. using namespace std;
  19.  
  20. template <typename It>
  21. void PrintRange(It range_begin, It range_end){
  22.     for(auto it = range_begin; it != range_end; ++it){
  23.         cout << *it << " "s;
  24.     }
  25.     cout << endl;
  26. }
  27.  
  28. template <typename Type>
  29. class Stack{
  30. public:
  31.     void Push(const Type &element){ //Вставка элемента в стек
  32.         elements_.push_back(element);
  33.     }
  34.     void Pop(){ //Удаление элемента из стека
  35.         elements_.pop_back();
  36.     }
  37.     const Type &Peek() const{ //Получение значения вершины стека
  38.         /*const Type type;
  39.         for(size_t i = 0; i < elements_.size(); ++i){
  40.             if(elements_.at(i) == elements_.size() - 1){
  41.                 type = elements_.at(i);
  42.             }            
  43.         }
  44.         return type;*/
  45.         //return elements_[static_cast<int>(elements_.size()) - 1];
  46.         return elements_.back();
  47.     }
  48.     Type &Peek(){ //Получение значения вершины стека
  49.         /*Type type;
  50.         for(size_t i = 0; i < elements_.size(); ++i){
  51.             if(elements_.at(i) == elements_.size() - 1){
  52.                 type = elements_.at(i);
  53.             }
  54.         }
  55.         return type;*/
  56.         //return elements_[static_cast<int>(elements_.size()) - 1];
  57.         return elements_.back();
  58.     }
  59.     void Print() const{ // вывод в консоль
  60.         PrintRange(elements_.begin(), elements_.end());
  61.     }
  62.     uint64_t Size() const{ //Размер стека — Size
  63.         //return static_cast<uint64_t>(elements_.size());
  64.         return elements_.size();
  65.     }
  66.     bool IsEmpty() const{ //Проверка на пустоту
  67.         return elements_.empty();
  68.     }
  69.     const Type &Front() const{
  70.         return elements_.front();
  71.     }
  72.     Type &Front(){
  73.         return elements_.front();
  74.     }
  75.     ~Stack(){};
  76. private:
  77.     vector<Type> elements_;
  78. };
  79.  
  80. template <typename Type>
  81. class StackMin{
  82. public:    
  83.     void Push(const Type &element){
  84.         elements_.Push(element);
  85.         //minimum_.Push({element, elements_.Peek()});
  86.         minimum_.Push({elements_.Peek(), element});
  87.     }
  88.     void Pop(){
  89.         if(elements_.Size() != 0){
  90.             elements_.Pop();
  91.         }        
  92.         if(minimum_.Size() != 0){
  93.             minimum_.Pop();
  94.         }        
  95.     }
  96.     const Type &Peek() const{
  97.         return elements_.Peek();
  98.     }
  99.     Type &Peek(){
  100.         return elements_.Peek();
  101.     }
  102.     void Print() const{
  103.         elements_.Print();
  104.     }
  105.     uint64_t Size() const{
  106.         return elements_.size();
  107.     }
  108.     bool IsEmpty() const{
  109.         return elements_.IsEmpty();
  110.     }
  111.     const Type PeekMin() const{
  112.         return minimum_.Front();
  113.     }
  114.     Type PeekMin(){
  115.         return minimum_.Front();
  116.     }
  117.     ~StackMin(){};
  118. private:
  119.     Stack<Type> elements_;
  120.     //map<Type, vector<Type>> minimum_;
  121.     Stack<pair<Type, Type>> minimum_;
  122. };
  123.  
  124. int main(){
  125.     setlocale(LC_ALL, "");
  126.     StackMin<int> stack;    
  127.     vector<int> values(5);
  128.     iota(values.begin(), values.end(), 1);
  129.     //random_shuffle(values.begin(), values.end());
  130.     for(int i = 0; i < 5; ++i){
  131.         stack.Push(values[i]);
  132.     }
  133.     while(!stack.IsEmpty()){
  134.         stack.Print();
  135.         cout << "Минимум = "s << stack.PeekMin() << endl;
  136.         stack.Pop();
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment