Presentation is loading. Please wait.

Presentation is loading. Please wait.

CMSC 341 Stacks and Queues 4/29/2019.

Similar presentations


Presentation on theme: "CMSC 341 Stacks and Queues 4/29/2019."— Presentation transcript:

1 CMSC 341 Stacks and Queues 4/29/2019

2 Stack ADT Restricted List only add to top only remove from top
Examples pile of trays partial results local state 4/29/2019

3 Relation to Previous List
Using inheritance: Stack Is-A List Need to pay special intention that List operations are properly performed Using aggregation: Stack Has-A List Could code stack from scratch -- as book does could inherit from list, but some ops not appropriate use aggregation to use some ops With inheritance: stack.first() not valid, since it would allow iteration With aggregation: Stack operations translated to List operations 4/29/2019

4 Stack.H void pop(); #include “LinkedList.H”
template <class Object> class Stack { public: Stack(); Stack(const Stack &coll); ~Stack(); bool isEmpty() const; bool isFull() const; const Object &top() const; void makeEmpty(); void pop(); void push(const Object &x); Object topAndPop(); const Stack &operator=(const Stack &stk); Private List data member which stores all stack elements. Operations are same as those in text. One difference, on an empty stack the following are illegal: top pop topAndPop 4/29/2019

5 Stack.H (cont) protected: const List<Object> &getList() const;
void setList(List<Object> &lst ListItr<Object> &getZeroth(); private: List<Object> _theList; ListItr<Object> _zeroth; }; Private data member that is an iterator. Used to provide position for insertion (push). It never changes. 4/29/2019

6 Stack.C template <class Object> Stack<Object>::Stack(){
_zeroth = getList().zeroth(); } Stack<Object>::Stack(const Stack &stk) { _theList = stk.getList(); Stack<Object>::~Stack() {} bool Stack<Object>::isEmpty() const{ return getList().isEmpty(); Top() uses first() to get top element. Each time top is called, an iterator is constructed. 4/29/2019

7 Stack.C (cont) template <class Object>
bool Stack<Object>::isFull()const{ return false; } const Object & Stack<Object>::top() const{ if (isEmpty()) throw StackException(“top on empty stack”); return getList().first().retrieve(); void Stack<Object>::makeEmpty () { getList().makeEmpty(); Top() uses first() to get top element. Each time top is called, an iterator is constructed. 4/29/2019

8 Stack.C (cont) template <class Object>
void Stack<Object>::pop() { if (isEmpty()) throw StackException(“pop on empty stack”); getList().remove(top()); } void Stack<Object>::push(const Object &x) { getList().insert(x, getZeroth()); Object Stack<Object>::topAndPop () { throw StackException(“topAndPop on empty stack”); Object tmp = top(); pop(); return tmp; Top() uses first() to get top element. Each time top is called, an iterator is constructed. 4/29/2019

9 Stack.C (cont) template <class Object>
const Stack<Object> &Stack<Object>:: operator=(const Stack &stk) { if (this != &stk){ setList(stk.getList()); setZeroth(getList().zeroth()); } return *this; const List<Object> &Stack<Object>::getList() { return _theList; ListItr<Object> &Stack<Object>::getZeroth () { return _zeroth; Top() uses first() to get top element. Each time top is called, an iterator is constructed. 4/29/2019

10 StackException.H class StackException { public:
StackException(); // Message is the empty string StackException(const string & errorMsg); StackException(const StackException & ce); ~StackException(); const StackException & operator=(const StackException & ce); const string & errorMsg() const; // Accessor for msg private: string _msg; }; 4/29/2019

11 StackException.C StackException::StackException(){}
StackException::StackException(const string & errorMsg){ _msg = errorMsg; } StackException::StackException(const StackException &ce){ _msg = ce.errorMsg(); StackException::~StackException(){} 4/29/2019

12 StackException.C (cont)
const StackException & StackException::operator=(const StackException & ce) { if (this == &ce) return *this; // don't assign to itself _msg = ce.errorMsg(); return *this; } const string & StackException::errorMsg() const { return _msg; 4/29/2019

13 TestStack.C int main (){ Stack<int> stk; stk.push(1);
printStack(stk); Stack<int> otherstk; otherstk = stk; printStack(otherstk); cout << stk.topAndPop() << endl; 4/29/2019

14 TestStack.C (cont) printStack(stk); printStack(otherstk); try {
stk.pop(); } catch (StackException & e){ cout << e.errorMsg() << endl; 4/29/2019

15 TestStack_aux.C template <class Object>
void printStack( Stack<Object> & theStack ){ Stack<Object> tmp; if( theStack.isEmpty( ) ){ cout << "Empty stack" << endl; return; } while (theStack.isEmpty() == false) { Object topObj = theStack.top(); cout << topObj; tmp.push(topObj); // save on other stack theStack.pop(); if (theStack.isEmpty() == false) cout << ", "; cout << endl; 4/29/2019

16 TestStack_aux.C while (tmp.isEmpty() == false) {
Object topObj = tmp.top(); theStack.push(topObj); tmp.pop(); } 4/29/2019

17 Queue ADT Restricted List only add to end only remove from front
Examples line waiting for service jobs waiting to print Implementing a queue could use similar approach to stack want efficient access to both ends could use circular doubly-linked lists 4/29/2019

18 Queue.H void dequeue(); template <class Object> class Queue {
public: explicit Queue(int capacity=10); bool isEmpty() const; bool isFull() const; const Object &getFront() const; void makeEmpty(); void dequeue(); private: vector<Object> theArray; int currentSize; int front; int back; void increment (int &x); } 4/29/2019

19 Queue.C template <class Object>
void Queue<Object>::enqueue(const Object &x){ if (isFull()) throw Overflow(); increment (back); theArray[back] = x; currentSize++; } void Queue<Object>::increment(int &x) { if (++x == theArray.size()) x = 0; . 4/29/2019

20 theArray 4/29/2019 Template<class Object>
void Queue<Object>::makeEmpty() { currentSize = 0; front = 0; back = -1; } 4/29/2019

21 Queue.C (cont) template <class Object>
Object Queue<Object>::dequeue() { if (isEmpty()) throw Underflow(); currentSize--; Object frontItem = theArray[front]; increment(front); return frontItem; } Top() uses first() to get top element. Each time top is called, an iterator is constructed. 4/29/2019


Download ppt "CMSC 341 Stacks and Queues 4/29/2019."

Similar presentations


Ads by Google