nochnoikoshmar1

Untitled

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