CS200: Queues n Prichard Ch. 8 CS200 - Queues 1 Queues n First In - - PowerPoint PPT Presentation

cs200 queues
SMART_READER_LITE
LIVE PREVIEW

CS200: Queues n Prichard Ch. 8 CS200 - Queues 1 Queues n First In - - PowerPoint PPT Presentation

CS200: Queues n Prichard Ch. 8 CS200 - Queues 1 Queues n First In First Out (FIFO) structure n Imagine a checkout line n So removing and adding are done from opposite ends of structure. 1 2 3 4 5 q add to tail (back), remove from head


slide-1
SLIDE 1

CS200: Queues

n Prichard Ch. 8

CS200 - Queues 1

slide-2
SLIDE 2

Queues

n First In First Out (FIFO) structure n Imagine a checkout line n So removing and adding are done from

  • pposite ends of structure.

q add to tail (back), remove from head (front)

n Used in operating systems (e.g. print queue).

1 2 3 4 5

CS200 -Queues 2

slide-3
SLIDE 3

Possible Queue Operations

n enqueue(in newItem: QueueItemType)

q Add new item at the back of a queue

n dequeue(): QueueItemType

q Retrieve and remove the item at the front of a queue

n peek(): QueueItemType

q Retrieve item from the front of the queue. Retrieve the

item that was added earliest.

n isEmpty():boolean n createQueue()

3 CS200 - Queues

slide-4
SLIDE 4

Reference-Based Implementation 1

A linked list with two external references

q A reference to the front q A reference to the back

At which end do we enqueue / dequeue?

CS200 - Stacks 4

. 70 . 55 . Reference of the Last Node Reference of the First Node . 60 Item Next

WHY?

slide-5
SLIDE 5

Reference-Based Implementation 2

A circular linked list with one external reference

q lastNode references the back of the queue q lastNode.getNext() references the front

CS200 -Queues 5

70 . 55 60 . Last Node: node reference .

slide-6
SLIDE 6

.

Inserting an item into a nonempty queue

6

70 . 55 60 .

Last Node

1.

newNode.next = lastNode.next;

2.

lastNode.next = newNode;

3.

lastNode = newNode;

85 .

New node

CS200 -Queues

slide-7
SLIDE 7

Inserting a New Item

7

.

n Insert a new item into the empty queue

Last Node

60 .

CS200 -Queues

slide-8
SLIDE 8

Insert new item into the queue

public void enqueue (Object newItem){ Node newNode = new Node(newItem); if (isEmpty()){ newNode.next = newNode; } else { newNode.next = lastNode.next; lastNode.next = newNode; } lastNode = newNode; }

8

  • A. Empty queue
  • B. items in queue

CS200 -Queues

slide-9
SLIDE 9

Removing an item from queue

public Object dequeue() throws QueueException{ if (!isEmpty()){ Node firstNode = lastNode.next; if (firstNode == lastNode) { lastNode = null; } else{ lastNode.next = firstNode.next; } return firstNode.item; } else { exception handling.. } }

9

Why?

CS200 -Queues

slide-10
SLIDE 10

Removing an Item

10

70 . 60 . 80 .

Last Node

.

Node firstNode = lastNode.next; if (firstNode == lastnode) { lastNode = null;} else{lastNode.next = firstNode.next;} return firstNode.item;

First Node

.

What happens to this node?

CS200 -Queues

slide-11
SLIDE 11

Naïve Array-Based Implementation

Drift wastes space How do we initialize front and back? (Hint: what does a queue with a single element look like? what does an empty queue look like? )

CS200 -Queues 11

slide-12
SLIDE 12

Solving Drift: Circular implementation of a queue

12

1 6 5 4 3 2 MAX_QUEUE-1 i a e

  • FRONT

BACK

CS200 -Queues

slide-13
SLIDE 13

Solving Drift:

n Delete

13

1 6 5 4 3 2 MAX_QUEUE-1 i a e

  • BACK

CS200 -Queues

slide-14
SLIDE 14

Solving Drift:

n Delete

14

1 6 5 4 3 2 MAX_QUEUE-1 i e

  • BACK

FRONT

CS200 -Queues

slide-15
SLIDE 15

Solving Drift

n Insert u

15

1 6 5 4 3 2 MAX_QUEUE-1 i

  • FRONT

u

When either front or back advances past MAX_QUEUE-1, it wraps around (to 0: using % MAX_QUEUE)

CS200 -Queues

slide-16
SLIDE 16

Queue with Single Item

n back and front are pointing at the same slot.

16

1 6 5 4 3 2 MAX_QUEUE-1 u

CS200 -Queues

slide-17
SLIDE 17

Empty Queue: remove Single Item

Remove last item.

q front passed back.

17

1 6 5 4 3 2 MAX_QUEUE-1 u

CS200 -Queues

When the queue is EMPTY, front is one slot ahead of back.

slide-18
SLIDE 18

Insert the last item

back catches up to front when the queue becomes full.

18

1 6 5 4 3 2 MAX_QUEUE-1 u

BACK

  • i

e a b f n

When the queue is FULL, front is one slot ahead of back as well. Problem?

CS200 -Queues

Maintain size: 0:empty max_queue: full Solution?

slide-19
SLIDE 19

Wrapping the values for front and back

n Initializing

front = 0 back = MAX_QUEUE-1 count = 0

n Adding

back = (back+1) % MAX_QUEUE; items[back] = newItem; ++count;

n Deleting

deleteItem = items[front]; front = (front +1) % MAX_QUEUE;

  • -count;

19 CS200 -Queues

slide-20
SLIDE 20

enqueue with Array

public void enqueue(Object newItem) throws QueueException{ if (!isFull()){ back = (back+1) % (MAX_QUEUE); items[back] = newItem; ++count; }else { throw new QueueException(your_message); } }

20 CS200 -Queues

slide-21
SLIDE 21

dequeue()

public Object dequeue() throws QueueException{ if (!isEmpty()){ Object queueFront = items[front]; front = (front+1) % (MAX_QUEUE);

  • -count;

return queueFront; }else{ throw new QueueException (your_message); } }

21 CS200 -Queues

slide-22
SLIDE 22

Implementation with (Array)List

n You can implement operation dequeue() as the

list operation remove(0).

n peek() as get(0) n enqueue() as add(newItem) // at tail

22

a e i o

Front of queue Back of queue Position in the list

0 1 2 3

CS200 -Queues

slide-23
SLIDE 23

Questions

n What is an advantage of the circular array

implementation over linked list?

  • A. Faster to enqueue
  • B. Uses less memory
  • C. Can more easily fix and enforce a maximum

size

  • D. Fewer allocations

CS200 -Queues 23

slide-24
SLIDE 24

Expressions: infix to postfix conversion

Prichard: 7.4

Let’s do some 2 + 3 * 4 2 * 3 + 4 2 + 3 - 4 2 + (3 - 4) 2 - 3 - 4 1 - (2 + 3 * 4) / 5

  • bservations?

CS200 -Queues 24

slide-25
SLIDE 25

Expressions: infix to postfix conversion

2 + 3 * 4 à 2 3 4 * + 2 * 3 + 4 à 2 3 * 4 + 2 + 3 - 4 à 2 3 + 4 - 2 + (3 - 4) à 2 3 4 - + 2 - 3 - 4 à 2 3 - 4 - 1 - (2 + 3 * 4) / 5 à 1 2 3 4 * + 5 / -

1.

  • perand order does not change

2.

  • perators come after second operand and obey

associativity and precedence rules

3.

( ) converts the inner expression to an independent postfix expression

CS200 -Queues 25

slide-26
SLIDE 26

infix to postfix implementation

n Use a queue to create the resulting postfix

expression

q the operands get immediately enqueued

n Use a stack to store the operators

q operators get pushed on the stack

n when to pop and enqueue?

q let’s play

CS200 -Queues 26

slide-27
SLIDE 27

2 + 3 * 4

stack queue action 2 + 3 * 4 enqueue + 3 * 4 2 push 3 * 4 + 2 enqueue * 4 + 2 3 push * 4 + 2 3 enqueue * + 2 3 4 pop; enqueue + 2 3 4 * pop; enqueue 2 3 4 * +

CS200 -Queues 27

slide-28
SLIDE 28

2 * 3 + 4

stack queue action 2 * 3 + 4 enqueue * 3 + 4 2 push 3 + 4 * 2 enqueue + 4 * 2 3 push? NO!! Because * has higher precedence than + and so binds to 2 3 + 4 * 2 3 pop; enqueue + 4 2 3 * push 4 + 2 3 * enqueue + 2 3 * 4 pop; enqueue 2 3 * 4 +

CS200 -Queues 28

slide-29
SLIDE 29

2 - 3 + 4

stack queue action 2 - 3 + 4 enqueue

  • 3 + 4 2 push

3 + 4 - 2 enqueue + 4 - 2 3 push? NO!! Because of left associativity – binds to 2 3 + 4 - 2 3 pop; enqueue + 4 2 3 - push 4 + 2 3 - enqueue + 2 3 - 4 pop; enqueue 2 3 - 4 +

CS200 -Queues 29

slide-30
SLIDE 30

2 – ( 3 + 4 )

stack queue action 2 – ( 3 + 4 ) enqueue

  • ( 3 + 4 ) 2 push

( 3 + 4 ) - 2 delete or push?

the expression inside the ( ) makes its own independent postfix, so we push the ( then use the stack as before until we see a ) then we pop all the operators

  • ff the stack and enqueue them, until we see a ( and delete the (

( 3 + 4 ) - 2 enqueue ( + 4 ) - 2 3 push + ( 4 ) - 2 3 enqueue continued next page

CS200 -Queues 30

slide-31
SLIDE 31

2 – ( 3 + 4 )

stack queue action + ( 4 ) - 2 3 enqueue + ( ) - 2 3 4 pop, enqueue until (, delete (

  • 2 3 4 + pop, enqueue until stack empty

2 3 4 + -

CS200 -Queues 31

slide-32
SLIDE 32

in2post algorithm

when encountering

  • perand: enqueue
  • pen: push

close: pop and enqueue operators, until open on stack pop open

  • perator:

if stack empty or top is open push, else pop and enqueue operators with greater or equal precedence, until operator with lower precedence on stack, or open on stack, or stack empty end of input: pop and enqueue all operators until stack empty

CS200 -Queues 32

Do it for: 1-(2+3*4)/5

slide-33
SLIDE 33

What about unary operators?

n e.g. not in logic expressions such as:

not true and false not ( true or false ) not not true not has higher priority than and, true and not false is true and (not false) and has higher priority than or not is right associative not not true is not ( not true )

CS200 -Queues 33

slide-34
SLIDE 34

not true and false

stack queue action not true and false push true and false not enqueue and false not true not higher priority pop, enqueue not and false true not push false and true not enqueue and true not false pop, enqueue true not false and

CS200 -Queues 34

slide-35
SLIDE 35

not(true or false)

stack queue action not (true or false) push (true or false) not push ( true or false) not enqueue (

  • r false ) not true push
  • r

( false ) not true enqueue

CS200 -Queues 35

slide-36
SLIDE 36

not(true or false) continued

stack queue action

  • r

( false ) not true enqueue

  • r

( pop, enqueue ) not true false until ( not true false or pop, enqueue true false or not

CS200 -Queues 36

slide-37
SLIDE 37

not not true

stack queue action

not not true push not true not push or enqueue? push! not is right associative, its operand is ahead of it not true not enqueue not not true pop and enqueue true not not

CS200 -Queues 37

slide-38
SLIDE 38

in2post algorithm

when encountering

  • perand: enqueue
  • pen: push

close: pop and enqueue operators, until open on stack pop open end of input: pop and enqueue all operators until stack empty

CS200 -Queues 38

slide-39
SLIDE 39

in2post continued

when encountering and, or: if stack empty or top is open push, else pop and enqueue operators with greater or equal precedence, until operator with lower precedence on stack, or open on stack, or stack empty not: push do it for not (not true or false)

CS200 -Queues 39