Dear All:

Here is the code I wrote.

Code:

#include <iostream>
using namespace std;
template <typename T>
class Stack;
template <typename T>
class Node{
private:
Node * next;
T* data;
public:
friend class Stack<T>;
Node():next(0),data(0){}
Node( Node * head, T * value):next(head),data(value){}
Node * GetNext(){ return next; }
void SetNext(const Node* newnext) {next = newnext;}
T* GetData() { return data; }
void SetData(const T* newdata) { data = newdata;}
virtual ~Node(){}
};
template <typename T>
class Stack{
public:
Stack():head(0){}
void Push( T* data);
T * Pop();
T * Top();
virtual ~Stack();
private:
Node<T> * head;
};
template <typename T>
void Stack<T>::Push( T* data){
head = new Node<T>(head,data);
}
template <typename T>
T* Stack<T>::Pop(){
if (!head) return NULL;
Node<T> * oldhead = head;
T * result = head->GetData();
head = head->GetNext();
delete(oldhead);
return result;
}
template <typename T>
T* Stack<T>::Top(){
if (!head) return NULL;
return (head->GetData());
}
template <typename T>
Stack<T>::~Stack(){
while(head){
Node<T>* oldhead = head;
head = head->GetNext();
delete(oldhead);
}
}
int main(){
Stack<int>* test = new Stack<int>;
int x=1,y=2,z=3;
test->Push(&x);
test->Push(&y);
test->Push(&z);
cout<<*(test->Top())<<endl;
test->Pop();
cout<<*(test->Top())<<endl;
delete(test);
return 0;
}

This code implements a Stack.

I tried to declare: (with const)

Code:

Node( const Node * head, const T * value):next(head),data(value){}

But it fails to complie... I am so confused....

BTW, I would polish this Stack as safe as possible, any suggestions to improve the robustness?