Вот реализация стека. Писал на 1 курсе... (задание было такое. Реальзовать стек на базе списка. С помощью этого стека реализовать Т-образный перекрёсток для отсеевания поездов). Код "грубый"..
Код:

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
class node
{
friend class stack;
public:
node(const int &data = 0) : d(data), nextPtr(NULL){}
int getData() const { return d; }
node *getNextNode() const { return nextPtr; }
private:
node *nextPtr;
int d;
};
class stack
{
public:
stack() : top(NULL){}
~stack();
void inserRand(const int size);
void insertKeyboard(const int size);
void insertFile(const char *path);
void insert(const int &data);
bool empty() const { return top == 0; }
void sort();
void razdelit(const int val);
void proverka();
node *getTopNode() const{ return top; }
private:
node *top;
node *getNewNode(const int &data);
friend ostream& operator <<(ostream &out, stack &print);
friend stack& operator +(stack &one, stack &two);
};
ostream& operator <<(ostream &out, stack &print)
{
node *currentPtr = print.top;
while(currentPtr != NULL)
{
out << currentPtr->getData() << " ";
currentPtr = currentPtr->getNextNode();
}
return out;
}
stack& operator +(stack &one, stack &two)
{
stack *out = new stack;
if(!two.empty())
{
stack *twoTemp = new stack;
node *temp = two.getTopNode();
while(temp != NULL)
{
twoTemp->insert(temp->getData());
temp = temp->getNextNode();
}
temp = twoTemp->getTopNode();
while(temp != NULL)
{
out->insert(temp->getData());
temp = temp->getNextNode();
}
delete twoTemp;
}
if(!one.empty())
{
stack *oneTemp = new stack;
node *temp = one.getTopNode();
while(temp != NULL)
{
oneTemp->insert(temp->getData());
temp = temp->getNextNode();
}
temp = oneTemp->getTopNode();
while(temp != NULL)
{
out->insert(temp->getData());
temp = temp->getNextNode();
}
delete oneTemp;
}
return *out;
}
stack::~stack()
{
if(!empty())
{
node *tempPtr, *currentPtr = top;
while(currentPtr != NULL)
{
tempPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
delete tempPtr;
}
}
}
void stack::insert(const int &data)
{
node *newNode = getNewNode(data);
if(empty())
{
top = newNode;
}
else
{
newNode->nextPtr = top;
top = newNode;
}
}
node *stack::getNewNode(const int &data)
{
node *newNode = new node(data);
if(newNode != NULL)
return newNode;
else
cerr << "Error. No memory available" << endl << endl;
return NULL;
}
void stack::sort()
{
stack *one = new stack;
stack *two = new stack;
node *currentPtr = top;
while(currentPtr != NULL)
{
if(currentPtr->getData() == 0) one->insert(0);
else two->insert(currentPtr->getData());
currentPtr = currentPtr->nextPtr;
}
cout << endl << endl;
cout << *one;
cout << endl << endl;
cout << *two;
}
void stack::inserRand(const int size)
{
srand(time(NULL));
for(int i = 0; i < size; i++)
this->insert(rand()%2);
}
void stack::insertKeyboard(const int size)
{
int data;
for(int i = 0; i < size; i++)
{
cin >> data;
this->insert(data);
}
}
void stack::insertFile(const char *path)
{
ifstream file(path, ios::in);
if(!file) cerr << "Error. File is not found." << endl;
else
{
int data;
while(!file.eof())
{
file >> data;
this->insert(data);
}
}
}
void stack::razdelit(const int val)
{
int proverka = 0;
stack *one = new stack;
stack *two = new stack;
stack *oneTemp = new stack;
stack *twoTemp = new stack;
node *temp = this->getTopNode();
while(temp != NULL)
{
temp = temp->getNextNode();
proverka++;
}
temp = this->getTopNode();
for(int i = 0; i < val; i++)
{
one->insert(temp->getData());
temp = temp->getNextNode();
}
for(int i = val; i < proverka; i++)
{
two->insert(temp->getData());
temp = temp->getNextNode();
}
temp = one->getTopNode();
while(temp != NULL)
{
oneTemp->insert(temp->getData());
temp = temp->getNextNode();
}
temp = two->getTopNode();
while(temp != NULL)
{
twoTemp->insert(temp->getData());
temp = temp->getNextNode();
}
cout << endl << "1: " << *oneTemp << endl;
cout << "2: " << *twoTemp << endl;
delete one, two, oneTemp, twoTemp;
}
void stack::proverka()
{
node *temp = this->getTopNode();
int proverk = 0;
while(temp != NULL)
{
temp = temp->getNextNode();
proverk ++;
}
if(proverk >= 30)
{
this->razdelit(proverk/2);
}
}
#endif // STACK_H_INCLUDED
А вообще советую открыть (если нету то в гугле: скачать книгу "Как программировать на C++" Авторы Харви Дейтел & Пол Дейтел) книгу "Как программировать на C++". Там все виды динамических структур данных.