template<typename T>
struct Node
{
T data;
Node<T>* next;
};
template <typename T>
class MyStack
{
private:
Node<T> node;
int max;
int top;
public:
MyStack(int maxSize = 100);
inline T pop();
inline bool push(T value);
};
template<typename T>
MyStack<T>::MyStack(int maxSize)
{
max = maxSize;
top = 0;
}
template<typename T>
inline T MyStack<T>::pop()
{
if (top > 0)
{
T data = node.data;
Node<T>* temp = node.next;
//delete node;
node = *temp;
top--;
return data;
}
return NULL;
}
template<typename T>
inline bool MyStack<T>::push(T value)
{
if(top >= max) return false;
Node<T>* tempNode = new Node<T>;
*tempNode = node;
node.data = value;
node.next = tempNode;
top++;
return true;
}
#include <memory>
template<typename T>
class Stack{
public:
Stack(std::size_t maxSize_): maxSize(maxSize_){}
// Что происходит, когда стек пуст? Можно бросить исключение, или сделать как в std
T pop(){
// if (!tmp) throw ...
auto tmp = std::move(head);
// Обратите внимание, теперь head пуст
head = std::move(tmp->next);
// Теперь tmp->next пуст
--size;
return tmp->value;
}
bool push(T value){
if (size+1 > maxSize)
return false;
// здесь может быть брошено исключение из-за нехватки памяти
std::unique_ptr<Node> tmp(new Node(value));
tmp->next = std::move(head);
head = std::move(tmp);
++size;
return true;
}
private:
struct Node{
T value;
std::unique_ptr<Node> next = nullptr;
Node(T value_) noexcept
: value(value_)
{ }
};
std::unique_ptr<Node> head = nullptr;
std::size_t maxSize;
std::size_t size = 0;
};