nochnoikoshmar1

Untitled

Apr 26th, 2023
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.94 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. #include <iomanip>
  19. using namespace std;
  20.  
  21. template <typename Type>
  22. struct PairWithMin{
  23.     Type element;
  24.     Type minimum;
  25. };
  26.  
  27. template <typename Type>
  28. ostream &operator<<(ostream &out, const PairWithMin<Type> &pair_to_print){
  29.     // будем выводить только сам элемент, выводить минимум не будем
  30.     out << pair_to_print.element;
  31.     return out;
  32. }
  33.  
  34. template <typename It>
  35. void PrintRange(It range_begin, It range_end){
  36.     for(auto it = range_begin; it != range_end; ++it){
  37.         cout << *it << " "s;
  38.     }
  39.     cout << endl;
  40. }
  41.  
  42. template <typename Type>
  43. class Stack{
  44. public:
  45.     void Push(const Type &element){ //Вставка элемента в стек
  46.         elements_.push_back(element);
  47.     }
  48.     void Pop(){ //Удаление элемента из стека
  49.         elements_.pop_back();
  50.     }
  51.     const Type &Peek() const{ //Получение значения вершины стека
  52.         /*const Type type;
  53.         for(size_t i = 0; i < elements_.size(); ++i){
  54.             if(elements_.at(i) == elements_.size() - 1){
  55.                 type = elements_.at(i);
  56.             }            
  57.         }
  58.         return type;*/
  59.         //return elements_[static_cast<int>(elements_.size()) - 1];
  60.         return elements_.back();
  61.     }
  62.     Type &Peek(){ //Получение значения вершины стека
  63.         /*Type type;
  64.         for(size_t i = 0; i < elements_.size(); ++i){
  65.             if(elements_.at(i) == elements_.size() - 1){
  66.                 type = elements_.at(i);
  67.             }
  68.         }
  69.         return type;*/
  70.         //return elements_[static_cast<int>(elements_.size()) - 1];
  71.         return elements_.back();
  72.     }
  73.     void Print() const{ // вывод в консоль
  74.         PrintRange(elements_.begin(), elements_.end());
  75.     }
  76.     uint64_t Size() const{ //Размер стека — Size
  77.         //return static_cast<uint64_t>(elements_.size());
  78.         return elements_.size();
  79.     }
  80.     bool IsEmpty() const{ //Проверка на пустоту
  81.         return elements_.empty();
  82.     }
  83.     const Type &Front() const{
  84.         return elements_.front();
  85.     }
  86.     Type &Front(){
  87.         return elements_.front();
  88.     }
  89.     ~Stack(){};
  90. private:
  91.     vector<Type> elements_;
  92. };
  93.  
  94. template <typename Type>
  95. class StackMin{
  96. public:    
  97.     void Push(const Type &element){
  98.         /*if(!minimum_.IsEmpty()){
  99.             if(element > minimum_.Front().second){
  100.                 minimum_.Push({element, minimum_.Front().second});
  101.             }
  102.         } else{
  103.             minimum_.Push({element,element});
  104.         }*/
  105. //_________________________________________________________________
  106.         PairWithMin<Type> new_pair = {element, element};
  107.         // проверим, что должно стать минимумом для текущего элемента -
  108.         // он сам, или предыдущий минимум
  109.         if(!minimum_.IsEmpty() && new_pair.minimum > minimum_.Peek().minimum){
  110.             new_pair.minimum = minimum_.Peek().minimum;
  111.         }
  112.         // положим структуру в стек
  113.         minimum_.Push(new_pair);
  114.     }
  115.     void Pop(){
  116.         if(minimum_.Size() != 0){
  117.             minimum_.Pop();
  118.         }
  119.     }
  120.     const Type &Peek() const{
  121.         return minimum_.Peek().element;
  122.     }
  123.     Type &Peek(){
  124.         return minimum_.Peek().element;
  125.     }
  126.     void Print() const{
  127.         minimum_.Print();
  128.     }
  129.     uint64_t Size() const{
  130.         return minimum_.Size();
  131.     }
  132.     bool IsEmpty() const{
  133.         return minimum_.IsEmpty();
  134.     }
  135.     const Type PeekMin() const{
  136.         return minimum_.Peek().minimum;
  137.     }
  138.     Type PeekMin(){
  139.         return minimum_.Peek().minimum;
  140.     }
  141.     ~StackMin(){};
  142. private:
  143.     Stack<PairWithMin<Type>> minimum_;  
  144. };
  145.  
  146. template <typename Type>
  147. class SortedSack{
  148. public:
  149.     void Push(const Type &element){      
  150.         if(!elements_.IsEmpty()){
  151.             if(element <= elements_.Peek()){
  152.                 elements_.Push(element);
  153.             } else{
  154.                 //elements_.Push(elements_.Front());
  155.                 elements_.Push(elements_.Peek());
  156.                 //elements_.Push(element);
  157.             }
  158.         } else{
  159.             elements_.Push(element);
  160.         }
  161.         for(size_t i = 0; i < elements_.Size(); i++){
  162.             if(elements_.Peek() <= element){
  163.                 elements_.Pop();
  164.                 elements_.Push(element);
  165.             }
  166.         }
  167.     }
  168.     void Pop(){
  169.         elements_.Pop();
  170.     }
  171.     const Type &Peek() const{
  172.         return elements_.Peek();
  173.     }
  174.     Type &Peek(){
  175.         return elements_.Peek();
  176.     }
  177.     void Print() const{
  178.         elements_.Print();
  179.     }
  180.     uint64_t Size() const{
  181.         return elements_.Size();
  182.     }
  183.     bool IsEmpty() const{      
  184.         return elements_.IsEmpty();
  185.     }    
  186.     ~SortedSack(){};
  187. private:
  188.     Stack<Type> elements_;  
  189. };
  190.  
  191. int main(){
  192.     setlocale(LC_ALL, "");
  193.     SortedSack<int> sack;
  194.     vector<int> values(5);
  195.  
  196.     // заполняем вектор для тестирования нашего класса
  197.     iota(values.begin(), values.end(), 1);
  198.     // перемешиваем значения
  199.     random_shuffle(values.begin(), values.end());
  200.  
  201.     // заполняем класс и проверяем, что сортировка сохраняется после каждой вставки
  202.     for(int i = 0; i < 5; ++i){
  203.         cout << "Вставляемый элемент = "s << values[i] << endl;
  204.         sack.Push(values[i]);
  205.         sack.Print();
  206.     }
  207. }
Advertisement
Add Comment
Please, Sign In to add comment