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.