720 likes | 744 Views
Explore the concept of a stack data structure, its operations, and implementations in C++. Learn about stack operations like MakeEmpty, IsEmpty, IsFull, Push, Pop, and Top in this informative guide. Includes code snippets and examples.
E N D
Chapter 5 ADTs Stack and Queue
Stacks of Boxes and Books • TOP OF THE STACK • TOP OF THE STACK
Definition of Stack Logical (or ADT) level:A stack is an ordered group of homogeneous items (elements), in which the removal and addition of stack items can take place only at the top of the stack. A stack is a LIFO “last in, first out” structure.
Stack ADT Operations MakeEmpty -- Sets stack to an empty state. IsEmpty -- Determines whether the stack is currently empty. IsFull-- Determines whether the stack is currently full. Push (ItemType newItem) -- Throws exception if stack is full; otherwise adds newItem to the top of the stack. Pop -- Throws exception if stack is empty; otherwise removes the item at the top of the stack. ItemType Top -- Throws exception if stack is empty; otherwise returns a copy of the top item
ADT Stack Operations Transformers Push Pop Observers IsEmpty IsFull • change state • observe state
class StackType { public: StackType( ); bool IsFull () const; bool IsEmpty() const; void Push( ItemType item ); void Pop(); private: ItemType Top(); private: int top; ItemType items[MAX_ITEMS]; }; • What are the • pre and post • conditions?
// File: StackType.cpp #include "StackType.h" #include <iostream> StackType::StackType( ) { top = -1; } bool StackType::IsEmpty() const { return(top == -1); } bool StackType::IsFull() const { return (top = = MAX_ITEMS-1); }
void StackType::Push(ItemType newItem) { if( IsFull() ) throw FullStack(): top++; items[top] = newItem; } void StackType::Pop() { if( IsEmpty() ) throw EmptyStack(); top--; } ItemType StackType::Top() { if (IsEmpty()) throw EmptyStack(); return items[top]; }
Class Interface Diagram(Memory reversed to better illustrate concept) • StackType class • Private data: • top • [MAX_ITEMS-1] • . • . • . • [ 2 ] • [ 1 ] • items [ 0 ] • StackType • IsEmpty • IsFull • Push • Pop • Top
Tracing Client Code • letter • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • Private data: • top • [MAX_ITEMS-1] • . • . • . • [ 2 ] • [ 1 ] • items [ 0 ]
Tracing Client Code • letter • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • Private data: • top -1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] • [ 1 ] • items [ 0 ]
Tracing Client Code • ‘V’ • letter • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • Private data: • top 0 • [MAX_ITEMS-1] • . • . • . • [ 2 ] • [ 1 ] • items [ 0 ] ‘V’
Tracing Client Code • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 2 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘S’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘V’ • letter • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • Private data: • top 2 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘S’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘S’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’0
Tracing Client Code • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 2 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 2 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘K’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 2 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘K’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘K’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘C’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top 0 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘C’ • letter • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • Private data: • top 0 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Tracing Client Code • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top -1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
End of Trace • ‘V’ • char letter = ‘V’; • StackType charStack; • charStack.Push(letter); • charStack.Push(‘C’); • charStack.Push(‘S’); • if ( !charStack.IsEmpty( )) • charStack.Pop( ); • charStack.Push(‘K’); • while (!charStack.IsEmpty( )) • { letter = charStack.Top(); • charStack.Pop(0)} • letter • Private data: • top -1 • [MAX_ITEMS-1] • . • . • . • [ 2 ] ‘K’ • [ 1 ] ‘C’ • items [ 0 ] ‘V’
Another Stack Implementation One advantage of an ADT is that the implementation can be changed without the program using it knowing about it. The dynamic array implementation of the stack has a weakness -- the maximum size of the stack is passed to the constructor as parameter. Instead we can dynamically allocate the space for each stack element as it is pushed onto the stack.
ItemType is char • Private data: • topPtr • StackType • ‘C’ ‘V’ • class StackType • Top • IsEmpty • IsFull • Push • Pop • ~StackType
ItemType is float • Private data: • topPtr • StackType • class StackType • Top • IsEmpty • IsFull • Push • Pop • 23.4 -7.9 • ~StackType
ItemType is string • Private data: • topPtr • StackType • cat dog • class StackType • Top • IsEmpty • IsFull • Push • Pop • ~StackType
Tracing Client Code • ‘V’ • letter • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • ‘V’ • letter • Private data: • topPtr NULL • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘V’ • Private data: • topPtr • ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • ‘V’ • letter • Private data: • topPtr • ‘C’ ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘V’ • Private data: • topPtr • ‘S’ ‘ C’ ‘ V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘V’ • Private data: • topPtr • ‘S’ ‘ C’ ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘S’ • Private data: • topPtr • ‘C’ ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘S’ • Private data: • topPtr • ‘C’ ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘C’ • Private data: • topPtr • ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘C’ • Private data: • topPtr • ‘V’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘V’ • Private data: • topPtr • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • letter • ‘V’ • Private data: • topPtr • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
Tracing Client Code • ‘V’ • letter • Private data: • topPtr • ‘K’ • char letter = ‘V’; • StackType myStack; • myStack.Push(letter); • myStack.Push(‘C’); • myStack.Push(‘S’); • If (!myStack.IsEmpty() ) • { • letter = myStack.Top( ); • myStack.Pop(); • } • myStack.Push(‘K’);
// DYNAMICALLY LINKED IMPLEMENTATION OF STACK Struct NodeType; //Forward declaration class StackType { public: //Identical to previous implementation private: NodeType* topPtr; }; . . . Struct NodeType { ItemType info; NodeType* next; };
Adding newItem to the stack newItem = ‘B’; NodeType* location; location = new NodeType<char>; location->info = newItem; location->next = topPtr; topPtr = location; • ‘X’ ‘C’ ‘L’ • topPtr • newItem • ‘B’
Adding newItem to the stack newItem = ‘B’; NodeType* location; location = new NodeType<char>; location->info = newItem; location->next = topPtr; topPtr = location; • ‘X’ ‘C’ ‘L’ • topPtr • newItem • ‘B’ • location
Adding newItem to the stack newItem = ‘B’; NodeType* location; location = new NodeType<char>; location->info = newItem; location->next = topPtr; topPtr = location; • ‘X’ ‘C’ ‘L’ • topPtr • ‘B’ • newItem • location
Adding newItem to the stack newItem = ‘B’; NodeType* location; location = new NodeType<char>; location->info = newItem; location->next = topPtr; topPtr = location; • ‘X’ ‘C’ ‘L’ • topPtr • newItem • ‘B’ • ‘B’ • location
Adding newItem to the stack newItem = ‘B’; NodeType* location; location = new NodeType<char>; location->info = newItem; location->next = topPtr; topPtr = location; • ‘X’ ‘C’ ‘L’ • topPtr • newItem • ‘B’ • ‘B’ • location
Adding newItem to the stack newItem = ‘B’; NodeType* location; location = new NodeType<char>; location->info = newItem; location->next = topPtr; topPtr = location; • topPtr • newItem • ‘B’ • ‘X’ ‘C’ ‘L’ • ‘B’ • location