nochnoikoshmar1

Untitled

Apr 19th, 2023
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 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.  
  70. private:
  71.     vector<Type> elements_;
  72. };
  73.  
  74. template <typename Type>
  75. class StackMin{
  76. public:
  77.     void Push(const Type &element){
  78.         elements_.Push(element);
  79.         //minimum_[element].push_back(elements_.Peek());
  80.         for(int i = 0; i < elements_.Size(); i++){
  81.             minimum_[i] = i - 1;
  82.             while(minimum_[i] >= 0 && elements_[minimum_[i]] >= elements_[i]){
  83.                 minimum_[i] = minimum_[minimum_[i]];
  84.             }
  85.         }
  86.     }
  87.     void Pop(){
  88.         elements_.Pop();
  89.         /*auto elem = elements_.Peek();
  90.         minimum_[elem].pop_back();
  91.         if(minimum_[elem].size() == 0){
  92.             minimum_.erase(elem);
  93.         }
  94.         elements_.Pop(); */              
  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.         //const auto min = minimum_.begin();
  113.         //return minimum_[min].front();
  114.         return elements_.Peek();
  115.     }
  116.     Type &PeekMin(){
  117.         //auto min = minimum_.begin();
  118.         //return minimum_[min].front();
  119.         return elements_.Peek();
  120.     }
  121. private:
  122.     Stack<Type> elements_;
  123.     vector<pair<Type,Type>> minimum_;
  124. };
  125. int main(){
  126.     setlocale(LC_ALL, "");
  127.     stack<int> stacks;
  128.     StackMin<int> stack;    
  129.     vector<int> values(5);
  130.     // заполняем вектор для тестирования нашего стека
  131.     iota(values.begin(), values.end(), 1);
  132.     // перемешиваем значения
  133.     //random_shuffle(values.begin(), values.end());
  134.     // заполняем стек
  135.     for(int i = 0; i < 5; ++i){
  136.         stack.Push(values[i]);
  137.     }
  138.     // печатаем стек и его минимум, постепенно убирая из стека элементы
  139.     while(!stack.IsEmpty()){
  140.         stack.Print();
  141.         cout << "Минимум = "s << stack.PeekMin() << endl;
  142.         stack.Pop();
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment