//: C04:Stack.cpp {O}
// Linked list with nesting
#include "Stack.h"
#include <iostream>
using namespace std;

void Stack::Link::initialize(void* dat, Link* nxt)
{

/* Qui si puņ notare come la funzione initialize sia una member function della struttura Link, contenuta a sua volta nella struttura Stack */

data = dat;
next = nxt;

}



void Stack::initialize()
{

head = 0;

}



void Stack::push(void* dat) 
{

Link* newLink = new Link;        

/* Viene creato ed initializzato un nuovo elemento dello stack che viene poi messo in testa allo stack */

newLink->initialize(dat, head);
head = newLink;

}



void* Stack::peek()
{

/* Estrae l'elemnto in testa allo stack senza eliminarlo come fa la pop */


if(head == 0) cout << "Stack empty";
return head->data;

}



void* Stack::pop()
{

/* Elimina ad uno ad uno gli elemnti dello stack dalla testa fino al primo elemento inserito */

if(head == 0) return 0;
void* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;

}


void Stack::cleanup()
{

if(head != 0) cout << "Stack not empty" ;

} ///:~