#include <cstdlib>
#include <iostream>
template <class TData> class cLL
{
private:
	struct sNode
	{
		sNode *Prev;
		TData Data;
		sNode *Next;
		sNode(sNode *inPrev,TData inData,sNode *inNext)
		{
			Prev = inPrev;
			Data = inData;
			Next = inNext;
		}
		sNode()
		{
			Prev = NULL;
			Next = NULL;
		};
		~sNode(){}
	};
public:
	sNode *Head;
	sNode *Tail;
	cLL <TData>()
	{
		Head = Tail = NULL;
	};
	~cLL <TData>(){};
	void Push(TData Data)
	{
		sNode *tmpOldHead;
		if(Head == NULL)
		{
			Head = new sNode(NULL,Data,NULL);
			Tail = Head;
		}
		else
		{
			tmpOldHead = Head;
			Head = new sNode(NULL,Data,tmpOldHead);
			tmpOldHead->Prev = Head;
		}
	};
	TData Pop()
	{
		TData result;
		sNode *tmpOldHead;
		if(Head != NULL)
		{
			result = Head->Data;
			tmpOldHead = Head;
			Head = Head->Next;
			delete tmpOldHead;
			return result;
		}
	};
	TData Poke()
	{
		if(Head != NULL)
		{
			return Head->Data;
		}
	};
	void PrintList()
	{
		sNode *CurrentNode = Head;
		while(CurrentNode != NULL)
		{
			std::cout << CurrentNode->Data << "\n";
			CurrentNode = CurrentNode->Next;
		}
	}
};