Стэковая память в С++
Как уменьшить размер массива на 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 и ещё много чего, но на первое время достаточно