Source of Listing7-4.cpp


  1: //  Created by Frank M. Carrano and Timothy M. Henry.
  2: //  Copyright (c) 2017 Pearson Education, Hoboken, New Jersey.

  4: /** Listing 7-4.
  5:     @file LinkedStack.cpp */

  7: #include <cassert>        // For assert
  8: #include "LinkedStack.h"  // Header file

 10: template<class ItemType>
 11: LinkedStack<ItemType>::LinkedStack() : topPtr(nullptr)
 12: {
 13: }  // end default constructor

 15: template<class ItemType>
 16: LinkedStack<ItemType>::LinkedStack(const LinkedStack<ItemType>& aStack)
 17: {
 18:    // Point to nodes in original chain
 19:    Node<ItemType>* origChainPtr = aStack.topPtr;
 20:    
 21:    if (origChainPtr == nullptr)
 22:       topPtr = nullptr;  // Original stack is empty
 23:    else
 24:    {
 25:       // Copy first node
 26:       topPtr = new Node<ItemType>();
 27:       topPtr->setItem(origChainPtr->getItem());
 28:       
 29:       // Point to first node in new chain
 30:       Node<ItemType>* newChainPtr = topPtr;
 31:       
 32:       // Advance original-chain pointer
 33:       origChainPtr = origChainPtr->getNext();
 34:       
 35:       // Copy remaining nodes
 36:       while (origChainPtr != nullptr)
 37:       {
 38:          // Get next item from original chain
 39:          ItemType nextItem = origChainPtr->getItem();
 40:          
 41:          // Create a new node containing the next item
 42:          Node<ItemType>* newNodePtr = new Node<ItemType>(nextItem);
 43:          
 44:          // Link new node to end of new chain
 45:          newChainPtr->setNext(newNodePtr);
 46:          
 47:          // Advance pointer to new last node
 48:          newChainPtr = newChainPtr->getNext();
 49:          
 50:          // Advance original-chain pointer
 51:          origChainPtr = origChainPtr->getNext();
 52:       }  // end while
 53:       
 54:       newChainPtr->setNext(nullptr);           // Flag end of chain
 55:    }  // end if
 56: }  // end copy constructor

 58: template<class ItemType>
 59: LinkedStack<ItemType>::~LinkedStack()
 60: {
 61:         // Pop until stack is empty
 62:         while (!isEmpty())
 63:                 pop();
 64: }  // end destructor

 66: template<class ItemType>
 67: bool LinkedStack<ItemType>::push(const ItemType& newItem)
 68: {
 69:         Node<ItemType>* newNodePtr = new Node<ItemType>(newItem, topPtr);                                
 70:         topPtr = newNodePtr;
 71:    newNodePtr = nullptr;
 72:       
 73:         return true;
 74: }  // end push

 76: template<class ItemType>
 77: bool LinkedStack<ItemType>::pop()
 78: {
 79:         bool result = false;
 80:         if (!isEmpty())
 81:         {
 82:       // Stack is not empty; delete top
 83:                 Node<ItemType>* nodeToDeletePtr = topPtr;
 84:                 topPtr = topPtr->getNext();
 85:                 
 86:                 // Return deleted node to system
 87:       nodeToDeletePtr->setNext(nullptr);
 88:                 delete nodeToDeletePtr;
 89:       nodeToDeletePtr = nullptr;
 90:             
 91:       result = true;
 92:         }  // end if
 93:    
 94:         return result;        
 95: }  // end pop

 97: template<class ItemType>        
 98: ItemType LinkedStack<ItemType>::peek() const
 99: {
100:         assert(!isEmpty());  // Enforce precondition during debugging
101:    
102:         // Stack is not empty; return top
103:         return topPtr->getItem();
104: }  // end getTop
105: template<class ItemType>

107: bool LinkedStack<ItemType>::isEmpty() const
108: {
109:    return topPtr == nullptr;
110: }  // end isEmpty

112: // End of implementation file.