StackP.cpp
// *********************************************************
// Implementation file StackP.cpp for the ADT stack.
// Pointer-based implementation.
// *********************************************************
#include "StackP.h"  // header file
#include <stddef.h>  // for NULL
#include <assert.h>  // for assert
struct stackNode
{  stackItemType Item;
   ptrType       Next;
};  // end struct
stackClass::stackClass() : TopPtr(NULL)
{
}  // end default constructor
stackClass::stackClass(const stackClass& S) 
{
   if (S.TopPtr == NULL)
      TopPtr = NULL;  // original list is empty
   else
   {  // copy first node
      TopPtr = new stackNode;
      assert(TopPtr != NULL);
      TopPtr->Item = S.TopPtr->Item;
      // copy rest of list
      ptrType NewPtr = TopPtr;    // new list pointer
      for (ptrType OrigPtr = S.TopPtr->Next;
                   OrigPtr != NULL;
                   OrigPtr = OrigPtr->Next)
      {  NewPtr->Next = new stackNode;
         assert(NewPtr->Next != NULL);
         NewPtr = NewPtr->Next;
         NewPtr->Item = OrigPtr->Item;
      }  // end for
      NewPtr->Next = NULL;
   }  // end if
}  // end copy constructor
stackClass::~stackClass()
{
   bool Success;
   // pop until stack is empty (Success is false)
   Pop(Success);
   while (Success)
      Pop(Success);
   // Assertion: TopPtr == NULL
}  // end destructor
bool stackClass::StackIsEmpty() const
{
   return bool(TopPtr == NULL);
}  // end StackIsEmpty
void stackClass::Push(stackItemType NewItem, bool& Success)
{
   // create a new node
   ptrType NewPtr = new stackNode;
   Success = bool(NewPtr != NULL);  // check allocation
   if (Success)
   {  // allocation successful; set data portion of new node
      NewPtr->Item = NewItem;
      // insert the new node
      NewPtr->Next = TopPtr;
      TopPtr = NewPtr;
   }  // end if
}  // end Push
void stackClass::Pop(bool& Success)
{
   Success = bool(!StackIsEmpty());
   if (Success)
   {  // stack is not empty; delete top
      ptrType Temp = TopPtr;
      TopPtr = TopPtr->Next;
      // return deleted node to system
      Temp->Next = NULL;  // safeguard
      delete Temp;
   }  // end if
}  // end Pop
void stackClass::Pop(stackItemType& StackTop, bool& Success)
{
   Success = bool(!StackIsEmpty());
   if (Success)
   {  // stack is not empty; retrieve and delete top
      StackTop = TopPtr->Item;  
      ptrType Temp = TopPtr;
      TopPtr = TopPtr->Next;
      // return deleted node to system
      Temp->Next = NULL;  // safeguard
      delete Temp;
   }  // end if
}  // end Pop
void stackClass::GetStackTop(stackItemType& StackTop, 
                             bool& Success) const
{
   Success = bool(!StackIsEmpty());
   if (Success)
      // stack is not empty; retrieve top
      StackTop = TopPtr->Item;  
}  // end GetStackTop
// End of implementation file.