chapter 7 stacks dr. youssef harrath [email protected]

43
Chapter 7 Stacks Dr. Youssef Harrath [email protected]

Upload: jade-dean

Post on 28-Dec-2015

230 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

Chapter 7

Stacks

Dr. Youssef Harrath

[email protected]

Page 2: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

Outline

1. Introduction

2. Implementation of Stacks as Arrays

3. Example: Highest GPA

4. Linked Implementation of Stacks

5. Stack as Derived from the class linkedListType

6. Application of Stacks:

A. Postfix Expression Calculator

B. Print a Linked List Backwards

2Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Page 3: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

1. Introduction

3Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Stack of coins

Stack of books

Page 4: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

1. Introduction

4Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

A stack is a list of homogenous elements, wherein the addition

and deletion of elements occurs only at one end (top of the stack).

The bottom element of the stack is the earliest added one.

The top element is the last added item.

The last added item will be the first one to be deleted.

A stack is called a LIFO data structure.

Page 5: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

1. Introduction: Stack operations

5Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

A

push box A

AB

push box B

AB

C

push box C

AB

C

Retrieve the top element

AB

pop stack

Page 6: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

1. Introduction: Stack operations

6Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

The basic operations on a stack are:

initializeStack: intializes 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.

isFullStack: Checks whether the stack is full.

push: Adds a new element to the top of the stack.

top: returns the top of the stack.

pop: Removes the top of the stack.

Page 7: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays

7Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>class stackType{public:

const stackType<Type>& operator=(const stackType<Type>&);void initializeStack();bool isEmptyStack();bool isFullStack();void destroyStack();void push(const Type& newItem);Type top();void pop();stackType(int stackSize = 100);stackType(const stackType<Type>& otherStack);~stackType();

private:int maxStackSize;int stackTop; // variable to point to the top of the stackType *list;void copyStack(const stackType<Type>& otherStack);

};

Page 8: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

[99]

[3]

[2]

[1]

[0]

2. Implementation of Stacks as Arrays

8Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

A

B

C

D

.

.

.

100

4

maxStackSize

stackTop

list

stack

Page 9: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays

9Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

void

stackType<Type>::initializeStack()

{

stackTop = 0;

}template<class Type>

void stackType<Type>::destroyStack()

{

stackTop = 0;

}

Page 10: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays

10Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

bool stackType<Type>::isFullStack()

{

return(stackTop == maxStackSize);

}

template<class Type>

bool stackType<Type>::isEmptyStack()

{

return(stackTop == 0);

}

Page 11: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: push

11Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Store newItem in the array component indicated by stackTop.

Increment stackTop.

S

.

.

.

[99]

[3]

[2]

[1]

[0]

100

4

maxStackSize

stackTop

list

stack

u

n

n

S

.

.

.

[99]

[4]

[3]

[2]

[1]

[0]

100

5

maxStackSize

stackTop

list

stack

u

n

n

y

push(‘y’)

Page 12: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: push

12Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

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

{

if(!isFullStack())

{

list[stackTop] = newItem;

stackTop++;

}

else

cout<<"Cannot add to a full stack."<<endl;

}

Page 13: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: top

13Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

Type stackType<Type>::top()

{

assert(stackTop != 0);

return list[stackTop - 1];

}

Page 14: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: pop

14Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

B

.

.

.

[99]

[3]

[2]

[1]

[0]

100

4

maxStackSize

stackTop

list

stack

o

l

d

B

.

.

.

[99]

[3]

[2]

[1]

[0]

100

3

maxStackSize

stackTop

list

stack

o

l

d

pop()

Page 15: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: pop

15Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

void stackType<Type>::pop()

{

if(!isEmptyStack())

stackTop--;

else

cout<<"Cannot remove from an empty stack."<<endl;

}

Page 16: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: copyStack

16Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

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);

for(int j = 0; j < stackTop; j++)

list[j] = otherStack.list[j];

}

Page 17: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: constructor

17Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>stackType<Type>::stackType(int stackSize)

{if(stackSize <= 0){

cout<<"The size must be positive!"<<endl;maxStackSize = 100;

}else

maxStackSize = stackSize;stackTop = 0;list = new Type[maxStackSize];assert(list != NULL);

}

Page 18: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: destructor & copy constructor

18Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

stackType<Type>::~stackType()

{

delete [] list;

}

template<class Type>stackType<Type>::stackType(const stackType<Type>& otherStack)

{

list = NULL;

copyStack(otherStack);

}

Page 19: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

2. Implementation of Stacks as Arrays: overloading(=)

19Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

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

(const stackType<Type>&

otherStack)

{

if(this != &otherStack)

copyStack(otherStack);

return *this;

}

Page 20: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

3. Example: Highest GPA

20Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Write a C++ program that reads a data file consisting of

each student’s GPA followed by the student’s name. The

program then prints the highest GPA and the names of

all the students who received that GPA. The program

scans the input file only once.3.9 Marwa3.1 Ali3.9 Ahmad2.1 Salma3.9 Zahra1.8 Salah

Page 21: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

3. Example: Highest GPA: Algorithm

21Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

• Read the 1st GPA, the name of the 1st student, and assign the 1st

GPA to the highestGPA.

• Read the 2nd GPA, the name of the 2nd student. We compare the

second GPA with the highestGPA:

1. The new GPA > highestGPA

a. Update the value of the highestGPA

b. Destroy the stack

c. Insert the name of the new student into the stack.

2. The new GPA = highestGPA: add the name to the stack

3. The new GPA < highestGPA: we do nothing

• Read the next GPA and student name and repeat the steps 1, 2,

and 3 until we rich the end of the file.

Page 22: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

3. Example: Highest GPA: Algorithm

22Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

1. Declare the variables

2. Open the input file (treat the exception case)

3. Read the GPA and the student name

4. highestGPA = GPA

5. Initialize the stack

6. while(not end of file)

1. if(GPA > highestGPA)

1. destroyStack(stack)

2. push(stack, student name)

3. highestGPA = GPA

2. else if (GPA = highestGPA)

3. Read the GPA and student name

7. Output the highest GPA

8. Output the names of the students having the highest GPA

Page 23: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

3. Example: Highest GPA: Algorithm

23Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Program

Page 24: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: PartI

24Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>struct nodeType {Type info;nodeType<Type> link;}template<class Type>class linkedStackType {public:const linkedStackType <Type>& operator=(const linkedStackType <Type>&);void initializeStack();bool isEmptyStack();bool isFullStack();void destroyStack();void push(const Type& newItem);Type top();…

Page 25: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: Part II

25Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

void pop();

linkedStackType();

linkedStackType(const linkedStackType <Type>& otherStack);

~ linkedStackType ();

private:

nodeType <Type> *stackTop;

void copyStack(const stackType<Type>& otherStack);

};

Page 26: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks

26Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

stackTop

stack

Empty linked stack

stackTop

stack

Nonempty linked stack

C

B

A

Page 27: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: default constructor

27Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

linkedStackType<Type>::linkedStackType()

{

stackTop = NULL;

}

Page 28: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: destroyStack

28Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

void linkedStackType<Type>::destroyStack()

{

nodeType<Type> *temp;

while(stackTop != NULL)

{

temp = stackTop;

stackTop = stackTop->link;

delete temp;

}

}

Page 29: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: initializeStack

29Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

void linkedStackType<Type>::initializeStack()

{

destroyStack();

}

Page 30: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: isEmptyStack & isFullStack

30Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

bool linkedStackType<Type>::isEmptyStack()

{

return (stackTop == NULL);

}

template<class Type>

bool linkedStackType<Type>::isFullStack()

{

return false;

}

Page 31: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: push

31Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

stackTop

stack

C

B

A

push(D)

stackTop

stack

C

B

A

DnewNode

Page 32: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: push

32Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

void linkedStackType<Type>::push(const Type& newElement)

{

nodeType<Type> *newNode;

newNode = new nodeType<Type>;

assert(newNode != NULL);

newNode->info = newElement;

newNode->link = stackTop;

stackTop = newNode;

}

Page 33: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: top

33Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

Type linkedStackType<Type>::top()

{

assert(newNode != NULL);

return stackTop->info;

}

Page 34: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: pop

34Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

stackTop

stack

C

B

A

pop()

stackTop

stack C

B

A

temp

Page 35: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

4. Linked Implementation of Stacks: pop

35Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

template<class Type>

void linkedStackType<Type>::pop()

{

nodeType<Type> *temp;

if(stackTop != NULL)

{

temp = stackTop;

stackTop = stackTop->link;

delete temp;

}

else

cout<<“cannot delete from an empty stack!”<<endl;

}

Page 36: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

5. Stack as Derived from the class linkedListType

36Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

push insertFirst

initializeStack

isEmptyStack

initializeList

isEmptyList

The class linkedStackType can be derived from the class linkedListType

Page 37: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

5. Stack as Derived from the class linkedListType

37Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Program

Page 38: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

• The operator is after/before the operands

• Left to right evaluation

• No precedence

• No need for ()

6. Application of Stacks: Postfix Expression Calculator

38Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Infix notation

a + b a b + + a b

Postfix notation Prefix notation

• The operator is between

the operands

• Left to right evaluation

• Precedence

• ()

Lukasiewicz (Poland, 1950)

Page 39: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

6. Application of Stacks: Postfix Expression Calculator

39Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Infix Expression

a + b

a + b * c

a * b + c

(a + b) * c

(a - b) * (c + d)

(a + b) * (c - d / e) + f

a b – c d + *

Equivalent Postfix Expression

a b +

a b c * +

a b * c +

a b + c *

a b + c d e / - * f +

Page 40: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

6. Application of Stacks: Postfix Expression Calculator

40Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Infix

(6 + 3) * 2 =

Postfix

6 3 + 2 * =

6

push(6)

6

pop()

9

push(9)

18

push(18)

3

6

push(3)

9

2

push(2)pop() pop()

9

pop()

Page 41: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

6. Application of Stacks: Postfix Expression Calculator

41Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

Program will be given as a lab assignment

Page 42: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

6. Application of Stacks: Print a Linked List Backwards

42Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

10 155 20first

stackTopstack

10

15

5

20

Page 43: Chapter 7 Stacks Dr. Youssef Harrath yharrath@uob.edu.bh

6. Application of Stacks: Print a Linked List Backwards

43Dr. Youssef Harrath – University of Bahrain – ITCS 215 – 2010/2011

current = first;

while(current != NULL)

{

stack.push(current);

current = current->link;

}

Step 1: save the addresses of the nodes in a stack.

while(!stack.isEmpty())

{

current = stack.top();

stack.pop();

cout<<current->info<<“ “;

}

Step 2: print the linked list in reverse order.