• No results found

Chapter Objectives. Chapter 7. Stacks. Various Types of Stacks LIFO. Empty Stack. Stacks

N/A
N/A
Protected

Academic year: 2021

Share "Chapter Objectives. Chapter 7. Stacks. Various Types of Stacks LIFO. Empty Stack. Stacks"

Copied!
8
0
0

Loading.... (view fulltext now)

Full text

(1)

Data Structures Using C++ 1

Chapter 7

Stacks

Data Structures Using C++ 2

Chapter Objectives

• Learn about stacks

• Examine various stack operations

• Learn how to implement a stack as an array

• Learn how to implement a stack as a linked list

• Discover stack applications

• Learn to use a stack to remove recursion

• Become aware of the STL class stack

Data Structures Using C++ 3

Stacks

• Definition: list of homogeneous elements,

wherein the addition and deletion of

elements occur only at one end, called the

top of the stack

• Last In First Out (LIFO) data structure

• Used to implement function calls

• Used to convert recursive algorithms

(especially not tail recursive) into

nonrecursive algorithms

Data Structures Using C++ 4

Various Types of Stacks

LIFO

• Last In First Out (LIFO) data structure

(2)

Data Structures Using C++ 7

Stack Operations

Data Structures Using C++ 8

Basic Operations on a Stack

initializeStack

: Initializes the stack to an

empty state

destroyStack

: Removes all the elements

from the stack, leaving the stack empty

isEmptyStack

: Checks whether the stack is

empty. If empty, it returns true; otherwise, it

returns false

Data Structures Using C++ 9

Basic Operations on a Stack

isFullStack

: Checks whether the stack is full. If

full, it returns true; otherwise, it returns false

push

:

– Add new element to the top of the stack

– The input consists of the stack and the new element.

– Prior to this operation, the stack must exist and must

not be full

Data Structures Using C++ 10

Basic Operations on a Stack

top

: Returns the top element of the stack.

Prior to this operation, the stack must exist

and must not be empty.

pop

: Removes the top element of the stack.

Prior to this operation, the stack must exist

and must not be empty.

Data Structures Using C++ 11

Example of a Stack

Data Structures Using C++ 12

(3)

Data Structures Using C++ 13

initializeStack and destroyStack

template<class Type>

void stackType<Type>::initializeStack()

{

stackTop = 0;

}//end initializeStack

template<class Type>

void stackType<Type>::destroyStack()

{

stackTop = 0;

}//end destroyStack

Data Structures Using C++ 14

emptyStack and fullStack

template<class Type>

bool stackType<Type>::isEmptyStack()

{

return(stackTop == 0);

}//end isEmptyStack

template<class Type>

bool stackType<Type>::isFullStack()

{

return(stackTop == maxStackSize);

}//end isFullStack

Data Structures Using C++ 15

Push

Data Structures Using C++ 16

Push

template<class Type>

void stackType<Type>::push(const Type& newItem) {

if(!isFullStack()) {

list[stackTop] = newItem; //add newItem at the top //of the stack stackTop++; //increment stackTop }

else

cerr<<"Cannot add to a full stack."<<endl; }//end push

(4)

Data Structures Using C++ 19

Pop

Data Structures Using C++ 20

copyStack

template<class Type>

void stackType<Type>::copyStack(const stackType<Type>& otherStack) {

delete [] list;

maxStackSize = otherStack.maxStackSize; stackTop = otherStack.stackTop; list = new Type[maxStackSize]; assert(list != NULL);

//copy otherStack into this stack for(int j = 0; j < stackTop; j++)

list[j] = otherStack.list[j]; }//end copyStack

Data Structures Using C++ 21

Copy Constructor

template<class Type>

stackType<Type>::stackType(const stackType<Type>& otherStack) {

list = NULL; copyStack(otherStack); }//end copy constructor

Data Structures Using C++ 22

Overloading the Assignment

Operator (=)

template<class Type>

const stackType<Type>& stackType<Type>::operator=

(const stackType<Type>& otherStack) {

if(this != &otherStack) //avoid self-copy copyStack(otherStack);

return *this; }//end operator=

Data Structures Using C++ 23

Time-Complexity of Operations

of class stackType

Data Structures Using C++ 24

Stack Header File

//Header file: myStack.h #ifndef H_StackType #define H_StackType #include <iostream> #include <cassert> using namespace std;

//Place the definition of the class template stackType, as given //previously in this chapter, here.

//Place the definitions of the member functions, as discussed in //this chapter, here.

(5)

Data Structures Using C++ 25

Programming Example: Highest

GPA

Input

The program reads an input file consisting of each

student’s GPA, followed by the student’s name. Sample

data is:

3.8 Lisa

3.6 John

3.9 Susan

3.7 Kathy

3.4 Jason

3.9 David

3.4 Jack

Data Structures Using C++ 26

Programming Example: Highest

GPA (Algorithm)

1. Declare the variables.

2. Open the input file.

3. If the input file does not exist, exit the program.

4. Set the output of the floating-point numbers to a

fixed decimal format with a decimal point and

trailing zeroes. Also, set the precision to two

decimal places.

5. Read the GPA and student name.

6.

highestGPA = GPA;

7. Initialize the stack.

Data Structures Using C++ 27

Programming Example: Highest

GPA (Algorithm)

8. while (not end of file) {

8.1 if (GPA > highestGPA) {

8.1.1 destroyStack(stack); 8.1.2 push(stack, student name); 8.1.3 highestGPA = GPA; }

8.2 else

if(GPA is equal to highestGPA) push(stack, student name); 8.3 Read the GPA and student name; }

Data Structures Using C++ 28

Programming Example: Highest

GPA (Algorithm)

9.

Output the highest GPA.

10. Output the names of the students having the highest

GPA.

Programming Example: Highest

GPA (Sample Run)

Input File (Ch7_HighestGPAData.txt)

Programming Example: Highest

GPA (Sample Run)

(6)

Data Structures Using C++ 31

Empty and Nonempty

Linked Stack

Empty linked stack Nonempty linked stack

Data Structures Using C++ 32

Default Constructor

template<class Type> //default constructor

linkedStackType<Type>::linkedStackType()

{

stackTop = NULL;

}

Data Structures Using C++ 33

Destroy Stack

template<class Type>

void linkedStackType<Type>::destroyStack() {

nodeType<Type> *temp; //pointer to delete the node while(stackTop != NULL) //while there are elements

//in the stack {

temp = stackTop; //set temp to point to //the current node stackTop = stackTop->link; //advance stackTop

//to the next node delete temp; //deallocate the memory

//occupied by temp }

}//end destroyStack

Data Structures Using C++ 34

initializeStack and isStackEmpty

template<class Type>

void linkedStackType<Type>:: initializeStack() { destroyStack(); } template<class Type> bool linkedStackType<Type>::isEmptyStack() { return(stackTop == NULL); } template<class Type> bool linkedStackType<Type>::isFullStack() { return false;

Data Structures Using C++ 35

Push

Stack before the push

operation

Stack and newNode

Data Structures Using C++ 36

Push

Stack after the statement

newNode->link = stackTop;

executes

Stack after the statement

stackTop = newNode;

(7)

Data Structures Using C++ 37

Return Top Element

template<class Type>

Type linkedStackType<Type>::top() {

assert(stackTop != NULL); //if the stack is empty, //terminate the program return stackTop->info; //return the top element }//end top

Data Structures Using C++ 38

Pop

Stack before the pop operation

Data Structures Using C++ 39

Pop

Stack after the statements temp = stackTop;

and stackTop = stackTop->link;execute

Stack after the statement delete temp;

executes

Data Structures Using C++ 40

Application of Stacks:

Postfix Expression Calculator

Application of Stacks:

(8)

Data Structures Using C++ 43

Postfix Expression Calculator (Main Algorithm)

Data Structures Using C++ 44

Nonrecursive Algorithm to

reverse linked list

current = first; while(current != NULL) { stack.push(current); current = current->link; }

llistType, *newfirst = stack.pop(); current = newfirst;

while (!stack.empty()) current->link = stack.pop(); current->link = NULL;

Data Structures Using C++ 45

List After Execution of Statement

current = first;

Data Structures Using C++ 46

Repeated Execution of:

stack.push(current);

current = current->link;

Data Structures Using C++ 47

STL class stack

(Stack Container Adapter)

• Standard Template Library (STL) provides

a class to implement a stack in a program

• Name of the class defining a stack is

“stack”

• Name of the header file containing the

definition of the class stack is “stack”

Data Structures Using C++ 48

References

Related documents

These statements include projections and estimates and their underlying assumptions, statements regarding plans, objectives, intentions and expectations with respect to

SP points to location last item placed in block SP points to location last item placed in block SP SP decreases decreases when you put an item on the stack when you put an item on

The three drunken fishermen were used to such treatment, of course, but not the tree salesman, who even as a stowaway now felt that he had overpaid for the voyage. The three

Johns Hopkins Department of Computer Science Course 600.226: Data Structures, Professor: Jonathan Cohen. Queue Interface in Java Queue Interface

The report has four specific objectives. 1) To evaluate the inherent capacity of the Livestock Farmer Field Schools (LFFS) approach to contribute to the development goals

Greek painting undoubtedly served as a model for this fresco, but the Etruscan artist modified the scene consider-. ably by introducing figures from

Aspek pertama adalah kemampuan berargumentasi ilmiah para mahasiswa dalam kategori tinggi pada tahap penulisan claim dengan skor rata-rata sebesar 1,42 dari 2 namun semakin

The clumsy number systems used by the Romans retarded the development of mathematics.. It was not until cen- turies after the decline of Rome that a new awakening