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.