NickAndNick

Stack<int>

Mar 22nd, 2020
107
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. using namespace std;
  3. class Stack {
  4. public:
  5.     Stack(size_t buffer = 100)
  6.         : buffer_(buffer), stack_(new int [buffer_]), index_(0) {
  7.     }
  8.     Stack(const initializer_list<int> ilst)
  9.         : buffer_(ilst.size()), stack_(new int[buffer_]), index_(0) {
  10.         for (auto value : ilst) push(value);
  11.     }
  12.     Stack(const Stack& stack)
  13.         : buffer_(stack.capacity()), stack_(new int[buffer_]), index_(stack.index_) {
  14.         for (auto i = 0U; i < index_; ++i) stack_[i] = stack.stack_[i];
  15.     }
  16.     Stack(Stack&& stack)
  17.         : buffer_(stack.capacity()), stack_(move(stack.stack_)), index_(0) {
  18.     }
  19.     ~Stack() {
  20.         if (stack_ != nullptr) {
  21.             delete[] stack_;
  22.             stack_ = nullptr;
  23.             buffer_ = index_ = 0;
  24.         }
  25.     }
  26.     Stack operator=(const Stack& stack) {
  27.         if (this != &stack) {
  28.             buffer_ = stack.buffer_;
  29.             index_ = stack.index_;
  30.             for (auto i = 0U; i < index_; ++i) stack_[i] = stack.stack_[i];
  31.         }
  32.         return *this;
  33.     }
  34.     Stack operator=(Stack&& stack) {
  35.         if (this != &stack) {
  36.             buffer_ = stack.buffer_;
  37.             index_ = stack.index_;
  38.             stack_ = move(stack.stack_);
  39.         }
  40.         return *this;
  41.     }
  42.     void push(int value) {
  43.         if (index_ == buffer_) {
  44.             auto tmp = *this;
  45.             delete [] stack_;
  46.             buffer_ *= 2;
  47.             stack_ = new int[buffer_];
  48.             for (auto i = 0U; i < index_; ++i) stack_[i] = tmp.stack_[i];
  49.         }
  50.         stack_[index_] = value;
  51.         ++index_;
  52.     }
  53.     void push(const initializer_list<int> ilst) {
  54.         for (auto value : ilst) push(value);
  55.     }
  56.     int& top() {
  57.         return stack_[index_ - 1];
  58.     }
  59.     void pop() {
  60.         --index_;
  61.     }
  62.     bool empty()const {
  63.         return 0 == index_;
  64.     }
  65.      size_t size()const {
  66.         return index_;
  67.     }
  68.     size_t capacity()const {
  69.         return buffer_;
  70.     }
  71. private:
  72.     size_t buffer_;
  73.     int* stack_;
  74.     size_t index_;
  75. };
  76. void show(Stack& a) {
  77.     cout << "top: ";
  78.     if (!a.empty()) cout << a.top() << '\n';
  79.     else puts("empty");
  80.     cout
  81.         << "size: " << a.size() << '\n'
  82.         << "capacity: " << a.capacity() << '\n'
  83.         << "--------------\n";
  84. }
  85. int main() {
  86.     Stack a;
  87.     for (auto i = 1; i <= 150; ++i) a.push(i);
  88.     show(a);
  89.     for (auto i = 0; i < 25; ++i) if (!a.empty()) a.pop();
  90.     show(a);
  91.     Stack b = a;
  92.     show(b);
  93.     b.top() = 777;
  94.     show(b);
  95.     a = b;
  96.     show(a);
  97.     Stack c({ 1, 3, 5, 7, 9 });
  98.     show(c);
  99.     c.push({ 2, 4, 6, 8 });
  100.     show(c);
  101.     Stack d(c);
  102.     show(d);
  103.     Stack e(Stack({ 10, 11, 12, 13, 14, 15 }));
  104.     show(e);
  105.     while (!a.empty()) a.pop();
  106.     show(a);
  107.     cout.put('\n');
  108.     system("pause");
  109. }
RAW Paste Data