Стэковая память в С++

Как уменьшить размер массива на 1 элемент в функции pop()? Можно через вектор, было бы проще. Но надо поменять размер массива(как-то)

#include<iostream>


template<typename T>
struct stack {
 private:
  T* array = new int[1];
 public:

  stack push(T n) { 
   array[sizeof(array)] = n;
   array = (int *) realloc (array,sizeof(int) * sizeof(array));
  }

  stack pop() { 
   array[sizeof(array)] = 
  }

  T top() {
   return array[sizeof(array)];
  }

  bool empty() { 
   if(sizeof(array) == 1) return true;
   else return false;
  }
};

int main() {
 stack<int> abc;
 abc.push(5);
 abc.push(10);
 printf("%d\n", abc.top());
 printf("%s\n", abc.empty() == 0 ? "False" : "True");
 abc.pop(); //5
 printf("%d\n", abc.top());
}

Ответы (1 шт):

Автор решения: Кирилл Чуркин

Для стека вам определённо нужно использовать структуру односвязного списка

template<class T>
class stack_element {
public:
    T _value;
    stack_element<T>* _prev;
    stack_element(T& value, stack_element<T>* prev) : _value(value), _prev(prev) {}
};

template<class T>
class stack {
private:
    stack_element<T>* _top = nullptr;
public:
    stack<T>& push(T& value) {
        _top = new stack_element<T>(value, _top);
        return *this;
    }
    stack<T>& pop() {
        stack_element<T>* del_elem = _top;
        _top = _top._prev;
        delete del_elem;
        return *this;
    }
    T& top() { 
        if (!_top){
            throw std::exception("top is nullptr");
        }
        return _top._value;
    }
    bool empty() { return !_top;}
};

По хорошему нужно ещё учесть rvalue и ещё много чего, но на первое время достаточно

→ Ссылка