#include <iostream>
template<class T>
struct Node
{
T data;
Node<T> *next;
};
template<typename T>
class Stack{
private:
Node<T>* mHead;
public:
Stack();
Stack(const Stack&) = delete;
Stack& operator =(const Stack&) = delete;
~Stack();
void push(T data);
};
template<typename T>
Stack<T>::Stack()
{
mHead = NULL;
}
template<typename T>
Stack<T>::~Stack()
{
while (mHead)
{
std::cout << "deleting " << mHead->data << '\n';
Node<T> *tmp = mHead;
mHead = tmp->next;
delete tmp;
}
}
template<typename T>
void Stack<T>::push(T data)
{
std::cout << "pushing " << data << '\n';
Node<T>* temp = new Node<T>;
temp->data = data;
temp->next = mHead;
mHead = temp;
}
int main()
{
Stack<int> test;
for (int i=0; i<10; ++i)
test.push(i);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IE5vZGUKewogICAgVCBkYXRhOwogICAgTm9kZTxUPiAqbmV4dDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFN0YWNrewpwcml2YXRlOgogICAgTm9kZTxUPiogbUhlYWQ7CiAgICAKcHVibGljOgogICAgU3RhY2soKTsKICAgIFN0YWNrKGNvbnN0IFN0YWNrJikgPSBkZWxldGU7CiAgICBTdGFjayYgb3BlcmF0b3IgPShjb25zdCBTdGFjayYpID0gZGVsZXRlOwogICAgflN0YWNrKCk7CgogICAgdm9pZCBwdXNoKFQgZGF0YSk7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpTdGFjazxUPjo6U3RhY2soKQp7CiAgICBtSGVhZCA9IE5VTEw7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+ClN0YWNrPFQ+Ojp+U3RhY2soKQp7CiAgICB3aGlsZSAobUhlYWQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJkZWxldGluZyAiIDw8IG1IZWFkLT5kYXRhIDw8ICdcbic7CiAgICAgICAgTm9kZTxUPiAqdG1wID0gbUhlYWQ7CiAgICAgICAgbUhlYWQgPSB0bXAtPm5leHQ7CiAgICAgICAgZGVsZXRlIHRtcDsKICAgIH0KfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBTdGFjazxUPjo6cHVzaChUIGRhdGEpCnsKICAgIHN0ZDo6Y291dCA8PCAicHVzaGluZyAiIDw8IGRhdGEgPDwgJ1xuJzsKICAgIE5vZGU8VD4qIHRlbXAgPSBuZXcgTm9kZTxUPjsKICAgIHRlbXAtPmRhdGEgPSBkYXRhOwogICAgdGVtcC0+bmV4dCA9IG1IZWFkOwogICAgbUhlYWQgPSB0ZW1wOwp9CgppbnQgbWFpbigpCnsKICAgIFN0YWNrPGludD4gdGVzdDsKICAgIGZvciAoaW50IGk9MDsgaTwxMDsgKytpKQogICAgICAgIHRlc3QucHVzaChpKTsKfQo=