/* stack2.cpp - Linked list with nesting */

#include "Stack2.h"
#include "../require.h"
#include <iostream>

using namespace std;


Stack::Link::Link(void *data, Link *next) {
  this->data = data;
  this->next = next;
}


Stack::Link::~Link() {
  cout << "Stack::Link destructor" << endl;
}



Stack::Stack() {
  head = 0;
}


Stack::~Stack() {
  require(head == 0, "Stack not empty");
  cout << "Stack destructor" << endl;
}


void Stack::push(void *dat) {
  Link *newLink = new Link(dat, head);
  head = newLink;
}


void *Stack::peek() {
  require(head != 0, "Stack empty");
  return head->data;
}


void *Stack::pop() {
  if(head == 0) {
    return 0;
  }
  void *result = head->data;
  Link *oldHead = head;
  head = head->next;
  delete oldHead;
  return result;
}
