stacks queues introduction to trees. stacks an everyday example your boss keeps bringing you...

Post on 18-Jan-2018

214 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

An Everyday Example Your boss keeps bringing you important items to deal with and keeps saying: “Put that last ‘rush’ item I gave you on hold; this is more important, so rush it out first.” We’ll end up doing the last item first (last in, first out).

TRANSCRIPT

StacksQueues

Introduction to Trees

Stacks

An Everyday Example

• Your boss keeps bringing you important items to deal with and keeps saying:

“Put that last ‘rush’ item I gave you on hold; this is more important, so rush it out first.”

We’ll end up doing the last item first(last in, first out).

In general...

• A stack can keep track of, “Where was I?”– Activation Stack– Compilers

ifif

if

endifendif

if

• Cafeterias use stacks: Plates, trays...

LB

The Stack

Push Pop

Idea: a “Last In, First Out” (LIFO) data structure

Behaviors:• Push: Add to top of stack• Pop: Remove from top of stack (and return that

top value)• Top: Return topmost item (but leave it on the

stack)• Is_Full: is it full?• Is_Empty: is it empty?• Initialize: empty stack

Properties

The Stack as a Logical Data Structure

• The stack is an idea• It implies a set of logical behaviors• It can be implemented various ways– Using a linked list or a tree or an array

• In this example, we’ll focus on dynamic implementations using dynamic data...

Stacks:Dynamic Implementation

A linked list with restricted set of operations to change its state: only modified from one end

4

17

42

top

Defining the Node Type

This is the simple data structure we will use in the following example.

Node definesa record data isoftype Num next isoftype Ptr toa Nodeendrecord // Node

Recall that the same code (with some small modifications) will work with more complex data structures such as is shown here:

Student_Rec definesa Record Name isoftype String SSN isoftype String GPA isoftype Numendrecord // Student_Rec

Node definesa Record data isoftype Student_Rec next isoftype Ptr toa Nodeendrecord // Node

Complex Node Definition

procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node)// Purpose: push one value onto stack // Pre: top points to NIL-terminated list// Post: the list has one node added

procedure Pop (value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean)// Pop a value off stack; if empty, result// contains FALSE (value will be undefined)// Pre: top points to a NIL-terminated list// Post: list has one fewer, value is old data

Application Programmer Interface

Push

• Create new node• Add it to the front

17

42

top

Push

• Create new node• Add it to the front

42

17

top

4

temp

?

Push

• Create new node• Add it to the front

42

17

top

4

temp

Push

• Create new node• Add it to the front

4

42

17

top

Push

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) // Push one value onto stack

temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure // Push

Pop

• Capture the first value (to return)• Remove the first node (move top to next)

4

42

17

top

Pop

• Capture the first value (to return)• Remove the first node (move top to next)

4

42

17

top

value = 4

Pop

• Capture the first value (to return)• Remove the first node (move top to next)

4

42

17

top

value = 4

Pop

• Capture the first value (to return)• Remove the first node (move top to next)

42

17

top

value (4) is returned

Pop

procedure Pop (value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) // Pop an element off the stack

if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure // Pop

Student’s Choice?

DoTrace

SkipTrace

Algorithm Fragment.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

OK =N =

top.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

OK =N =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

OK =N =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure temp =

OK =N =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

42

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

42

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

42

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

topProcedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

42

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

OK =N =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

2

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

2

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

2

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

Procedure Push (value isoftype in Num, top isoftype in/out Ptr toa Node) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- top top <- tempendprocedure

2

OK =N =

temp =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

2

OK =N =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

2

OK =N =

Procedure Pop value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure

value =result =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

2

OK =N =

Procedure Pop value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure

value =result =

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

2

OK =N =

Procedure Pop value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure

value =result = T

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

2

OK =N =

Procedure Pop value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure

value = 2result = T

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

2

OK =N =

Procedure Pop value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure

value = 2result = T

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

OK =N =

Procedure Pop value isoftype out Num, top isoftype in/out Ptr toa Node, result isoftype out Boolean) if(top = NIL) then result <- FALSE else result <- TRUE value <- top^.data top <- top^.next endifendprocedure

value = 2result = T

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

OK = TN = 2

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

OK = TN = 2

2

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

OK = TN = 2

7

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

42

OK = TN = 7

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

OK = TN = 42

.top isoftype Ptr toa NodeOK isoftype BooleanN isoftype Numtop <- NILPush(42, top)Push(2, top)Pop(N, top, OK)if(OK) then print(N)endifPush(7, top)Pop(N, top, OK)Pop(N, top, OK).

top

OK = TN = 42

Summary: Stack

• Allow us to model “last-in, first-out” (LIFO) behavior

• Can be implemented using different data types

• Behavior is important (and defines a Stack)– Push to the front– Pop from the front– (from the same end)

Questions?

Queues

Some Examples

• Waiting in line– At the grocery store– At the movies– Printer queue

• Ordering items– Bills to pay–Making pizzas

• We can use a queue to model each of these.

LB

The Queue

Enqueue

Dequeue

Idea: a “First In, First Out” (FIFO) data structure

Behaviors:• Enqueue: Add to end of queue• Dequeue: Remove from front of queue (and

return that front value)• Front: Return front-most item (but leave it in the

queue)• Is_Full: is it full?• Is_Empty: is it empty?• Initialize: empty queue

Properties of Queues

The Queue as a Logical Data Structure

• The queue is an idea• It implies a set of logical behaviors• It can be implemented various ways– Using a linked list or a tree or an array

• In this example, we’ll focus on dynamic implementations using dynamic data...

Queues:Dynamic Implementation

A linked list with restricted set of operations to change its state: only modified by adding to one end and deleting from the other.

4 17 42

tailhead

Queue Record Definition

Queue definesa record head, tail isoftype Ptr toa Nodeendrecord // Queue

Defining the Node Type

This is the simple data structure we will use in the following example.

Node definesa record data isoftype Num next isoftype Ptr toa Nodeendrecord // Node

Recall that the same code (with some small modifications) will work with more complex data structures such as is shown here:

Student_Rec definesa Record Name isoftype String SSN isoftype String GPA isoftype Numendrecord // Student_Rec

Node definesa Record data isoftype Student_Rec next isoftype Ptr toa Nodeendrecord // Node

Complex Node Definition

Application Programmer Interfaceprocedure Enqueue (value isoftype in Num, Q isoftype in/out Queue)// Pre: Q is initialized// Purpose: Add a value to the tail// Post: Q has new element at tail

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean)// Pre: Q is initialized// Purpose: Remove first value from Q and// return it via ‘value’ OR indicate// that Q is empty via ‘result’ // Post: element that was at head has been// removed OR (result = FALSE)

Enqueue

• Create a new node with data• Add it to the end– Update pointers as needed

4 17

tailhead

Enqueue

• Create a new node with data• Add it to the end– Update pointers as needed

4 17

tailhead42

temp

Enqueue

• Create a new node with data• Add it to the end– Update pointers as needed

4 17

tailhead42

temp

Enqueue

• Create a new node with data• Add it to the end– Update pointers as needed

4 17

tailhead

42

temp

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then // was empty Q.tail <- temp Q.head <- temp else // was not empty Q.tail^.next <- temp Q.tail <- temp endifendprocedure // Enqueue

Dequeue

• Capture the first value (to return)• Remove the first node (move head to next)

4 17

head

42

tail

Dequeue

• Capture the first value (to return)• Remove the first node (move head to next)

value = 4

4 17

head

42

tail

Dequeue

• Capture the first value (to return)• Remove the first node (move head to next)

value = 4

4 17

head

42

tail

Dequeue

• Capture the first value (to return)• Remove the first node (move head to next)

value (4) is returned

17

head

42

tail

procedure Dequeue (value iot out Num, Q iot in/out Queue, result iot out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure // Dequeue

Initializing the Queue

procedure QInit (Q isoftype out Queue)// Initializes the Q head and tail// to point to nil, setting the Q to// be empty Q.head <- NIL Q.tail <- NILendprocedure // QInit

Student’s Choice

DoTrace

SkipTrace

Algorithm Fragment.myQ isoftype QueueOK isoftype BooleanN isoftype Num

Qinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

headtail

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

procedure Qinit (Q isoftype out Queue) Q.head <- NIL Q.tail <- NILendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

procedure Qinit (Q isoftype out Queue) Q.head <- NIL Q.tail <- NILendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

procedure Qinit (Q isoftype out Queue) Q.head <- NIL Q.tail <- NILendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

42

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif. OK N OK T N 42

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK T N 42

2

Peeking backat calling program.

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N

42

OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK N

2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

procedure Enqueue (value isoftype in Num, Q isoftype in/out Queue) temp isoftype Ptr toa Node temp <- new(Node) temp^.data <- value temp^.next <- NIL if(Q.tail = NIL) then Q.tail <- temp Q.head <- temp else Q.tail^.next <- temp Q.tail <- temp endifendprocedure temp

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 42

2

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 2

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK N OK T N 7

procedure Dequeue (value isoftype out Num, Q isoftype in/out Queue, result isoftype out Boolean) if(Q.head = NIL) then result <- FALSE else result <- TRUE value <- Q.head^.data Q.head <- Q.head^.next if(Q.head = NIL) then Q.tail <- NIL endif endifendprocedure

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK F N OK N 7

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK F N OK N 7

myQ is empty

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK F N OK N 7

myQ is empty

.myQ isoftype QueueOK isoftype BooleanN isoftype NumQinit(myQ)Enqueue(42, myQ)Enqueue(2, myQ)Dequeue(N, myQ, OK)Enqueue(7, myQ)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)Dequeue(N, myQ, OK)if(NOT OK) then print(“myQ is empty”)endif.

OK F N OK N 7

myQ is empty

Summary: Queues

• Allow us to model “first-in, first-out” (FIFO) behavior

• Can be implemented using different data types

• Behavior is important (and defines a Queue)– Enqueue to end– Dequeue from front– (or vice-versa – just do at opposite ends)

Questions?

Introduction to Trees

Trees

A non-linear, hierarchical collection with a “one to many” relationships

Visual Representation of a Tree

Trees allow each node to have multiple successors

Parent

Child

Tree Terminology

Parent

Child

Root

Leaf

Tree Terminology

• The first node is called the root.

• Successors are called children

• A parent node points to a child node.

• Nodes with no children are called leaves.

Binary Trees

Binary trees can have at most two successors.

Binary Tree ExampleNo imposed ordering.

25

42 7

105 111312

6817

Structure of a Binary Tree Node

<Type Name> definesa Record data isoftype <type> left_child isoftype Ptr toa <Type Name> right_child isoftype Ptr toa <Type Name>endrecord

left_child right_child

data

Example Definition: Binary Tree Node

Tree_Node definesa Record data isoftype Num left_child isoftype Ptr toa Tree_Node right_child isoftype Ptr toa Tree_Nodeendrecord // Tree_Node

root 34

25

21 29

45

41 52

Binary Search Trees

For each node, the value stored in it is greater than the value in every node in the left sub-tree and less than the value in every node in the right sub-tree

Can a Tree be a BST and not a BST?

LB

1100Bob

9494Sal

2102Abe

882Zak

904Ned

7856Tom

1234Ava

LB

Node Depth in a Tree• Measures how far down a node is in the tree.• How many “ancestor” nodes “live above” the

node?

0123

Balanced TreesRoughly symmetrical• There is a difference of a most one level of depth

among the various leaves

Balanced Not Balanced

Summary• Trees allow us to create nonlinear collections

• Binary Trees have at most two successors (children)

• Binary Search Trees impose structure– Every node’s value is greater than all the

values in its left sub-tree– Every node’s value is less than all the

values in its right sub-tree

Questions?

top related