queue adt operations enqueue, dequeue, peek, isempty implementation: circular array (weiss), linked...

31
Queue ADT Operations Enqueue, Dequeue, Peek, isEmpty Implementation: Circular Array (Weiss), Linked List, Circular Array (text) Application: Level-Order Tree Traversal

Upload: paxton-werry

Post on 16-Dec-2015

221 views

Category:

Documents


1 download

TRANSCRIPT

Queue ADTOperations• Enqueue, Dequeue, Peek, isEmpty

Implementation: • Circular Array (Weiss),• Linked List,• Circular Array (text)

Application:

Level-Order Tree Traversal

Implementing a Queue

• Using Vector /Array – requires estimate of maximum queue length– may grow dynamically– Ø = empty slots– Can contain varied data/objects (not necessarily

homogeneous)

28-17 Golf #1 Ø Ø Ø212 rules!

rearfront

Implementing a Queue

• Using Linked List– flexible, adjusts to problem size– implementing a linked list

• nodes and references/links/pointers

front 212 rules!28-17 Ø

rear

Golf #1

Implementing a Queue

• Using Linked List– implementing a linked list

• cursor implementation

front = 5

freelist = 8

0

1

2

3

4

5

6

7

8

2

-1

7

-1

1

4

3

6

0

Golf #1

212 rules!

28-17

Ø

Ø

Ø

Ø

Ø

Ø

rear = 1

Implementing a Queue

Vector/Array Linked List

– enqueue O(1)* O(1)– dequeue O(1) O(1)– peek O(1) O(1)– isEmpty O(1) O(1)

*assuming no need for Vector/Array expansion

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 0

rear = 0

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 0

rear = 0 1enqueue (“A”)

A

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 0

rear = 1 2enqueue (“B”)

A

B

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 0

rear = 2 3enqueue (“C”)

A

B

C

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 0 1

rear = 3dequeue()

// returns “A”

A

B

C

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 1 2

rear = 3dequeue()

// returns “B”

A

B

C

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

front = 2 3

rear = 3dequeue()

// returns “C”

A

B

C

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { } // isEmpty front = 3

rear = 3// Is the queue empty?// Complete isEmpty() method.

A

B

C

Q

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 3 4enqueue(“D”);

A

B

C

Q

D

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 4 5enqueue(“E”);

A

B

C

Q

DE

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 5 6enqueue(“F”);

A

B

C

Q

F

DE

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 6 7enqueue(“G”);

A

B

C

Q

F

DE

G

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 7 0enqueue(“H”);

A

B

C

Q

F

DE

G

H

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 0 1enqueue(“I”);

I

B

C

Q

F

DE

G

H

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty front = 3

rear = 1 2enqueue(“J”);

I

J

C

Q

F

DE

G

H

front = 3

rear = 2

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty

boolean isFull() { } // isFull

// Is the queue full?// Complete isFull() method.

I

J

C

Q

F

DE

G

H

front = 3 4

rear = 2

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty

boolean isFull() { return front==(rear+1)%Q.length;} // isFull

dequeue();// returns “D”

I

J

C

Q

F

DE

G

H

front = 4 5

rear = 2

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty

boolean isFull() { return front==(rear+1)%Q.length;} // isFull

dequeue();// returns “E”

I

J

C

Q

F

DE

G

H

front = 5

rear = 2

0 1

2

3

4

7

6

5

enqueue (Object item) { rear = (rear+1)%Q.length; if (front == rear) throw QueueFullException; Q[rear] = item;} // enqueue

Object dequeue() { if (front == rear) throw QueueEmptyException; front = (front+1)%Q.length; return Q[front];} // dequeue

boolean isEmpty() { return (front == rear); } // isEmpty

boolean isFull() { return front==(rear+1)%Q.length;} // isFull

// How many elements does the// queue have? Generalize.

I

J

C

Q

F

DE

G

H

Level-Order Traversal

B

D

A

E

I J K

M NL

F

H

C

G

Level-Order Traversal

B

D

A

E

I J K

M NL

F

H

C

G

Level 0

1

2

3

4

B

D

A

E

I J K

M NL

F

H

C

G

levelOrder (Node root) { Queue q; q.enqueue (root); while (!q.isEmpty()) { Node n = (Node) q.dequeue(); visit(n); if (n.left() != null) q.enqueue(n.left()); if (n.right() != null) q.enqueue(n.right()); } // while} // levelOrder

q = Ø

output =

B

D

A

E

I J K

M NL

F

H

C

G

levelOrder (Node root) { Queue q; q.enqueue (root); while (!q.isEmpty()) { Node n = (Node) q.dequeue(); visit(n); if (n.left() != null) q.enqueue(n.left()); if (n.right() != null) q.enqueue(n.right()); } // while} // levelOrder

q A

output =

B

D

A

E

I J K

M NL

F

H

C

G

levelOrder (Node root) { Queue q; q.enqueue (root); while (!q.isEmpty()) { Node n = (Node) q.dequeue(); visit(n); if (n.left() != null) q.enqueue(n.left()); if (n.right() != null) q.enqueue(n.right()); } // while} // levelOrder

q B C

output = A

B

D

A

E

I J K

M NL

F

H

C

G

levelOrder (Node root) { Queue q; q.enqueue (root); while (!q.isEmpty()) { Node n = (Node) q.dequeue(); visit(n); if (n.left() != null) q.enqueue(n.left()); if (n.right() != null) q.enqueue(n.right()); } // while} // levelOrder

q C D E

output = A B

B

D

A

E

I J K

M NL

F

H

C

G

levelOrder (Node root) { Queue q; q.enqueue (root); while (!q.isEmpty()) { Node n = (Node) q.dequeue(); visit(n); if (n.left() != null) q.enqueue(n.left()); if (n.right() != null) q.enqueue(n.right()); } // while} // levelOrder

q D E F G

output = A B C

etc.