Chapter 18 part 3

advertisement

C++ Programming:

Program Design Including

Data Structures,

Fourth Edition

Chapter 18: Stacks and Queues

(part 3)

Queues

• Queue: group of homogeneous elements

• Elements are:

− Added at one end (the back or rear)

− Deleted from the other end (the front)

• First In First Out (FIFO) data structure

− Middle elements are inaccessible

• Example:

− Waiting line in a bank

C++ Programming: Program Design Including Data Structures, Fourth Edition 2

Queue Operations

• Some of the queue operations are:

− initializeQueue

− isEmptyQueue

− isFullQueue

− front

− back

− addQueue

− deleteQueue

• Abstract class queueADT defines these operations

C++ Programming: Program Design Including Data Structures, Fourth Edition 3

Implementation of Queues as

Arrays

• You need at least four (member) variables:

− An array to store the queue elements

− queueFront and queueRear

• To keep track of first and last elements

− maxQueueSize

• To specify the maximum size of the queue

C++ Programming: Program Design Including Data Structures, Fourth Edition 4

Implementation of Queues as

Arrays (continued)

• To add an element to the queue:

− Advance queueRear to next array position

− Add element to position pointed by queueRear

• Example: array size is 100; originally empty

C++ Programming: Program Design Including Data Structures, Fourth Edition 5

Implementation of Queues as

Arrays (continued)

• To delete an element from the queue:

− Retrieve element pointed to by queueFront

− Advance queueFront to next queue element

C++ Programming: Program Design Including Data Structures, Fourth Edition 6

Implementation of Queues as

Arrays (continued)

• Will this queue design work?

− Suppose A stands for adding an element to the queue

− And D stands for deleting an element from the queue

− Consider the following sequence of operations:

• AAADADADADADADADA...

7 C++ Programming: Program Design Including Data Structures, Fourth Edition

Implementation of Queues as

Arrays (continued)

• The sequence AAADADADADADADADA...

would eventually set queueRear to point to the last array position

− Giving the impression that the queue is full

C++ Programming: Program Design Including Data Structures, Fourth Edition 8

Implementation of Queues as

Arrays (continued)

• Solution 1:

− When the queue overflows to the rear (i.e., queueRear points to the last array position):

• Check value of queueFront

• If value of queueFront indicates that there is room in the front of the array, slide all of the queue elements toward the first array position

• Problem: too slow for large queues

• Solution 2: assume that the array is circular

C++ Programming: Program Design Including Data Structures, Fourth Edition 9

Implementation of Queues as

Arrays (continued)

• To advance the index in a (logically) circular array:

C++ Programming: Program Design Including Data Structures, Fourth Edition 10

Implementation of Queues as

Arrays (continued)

• Case 1:

C++ Programming: Program Design Including Data Structures, Fourth Edition 11

Implementation of Queues as

Arrays (continued)

• Case 2:

C++ Programming: Program Design Including Data Structures, Fourth Edition 12

Implementation of Queues as

Arrays (continued)

• Problem:

− Figures 18-47 and 18-49 have identical values for queueFront and queueRear

− However, the former represents an empty queue, whereas the latter shows a full queue

• Solution?

C++ Programming: Program Design Including Data Structures, Fourth Edition 13

Implementation of Queues as

Arrays (continued)

• Solution 1: keep a count

− Incremented when a new element is added to the queue

− Decremented when an element is removed

− Initially, set to 0

− Very useful if user (of queue) frequently needs to know the number of elements in the queue

• We will implement this solution

14 C++ Programming: Program Design Including Data Structures, Fourth Edition

Implementation of Queues as

Arrays (continued)

• Solution 2: let queueFront indicate index of the array position preceding the first element

− queueRear still indicates index of last one

− Queue empty if:

• queueFront == queueRear

− Slot indicated by queueFront is reserved

• Queue can hold 99 (not 100) elements

− Queue full if the next available space is the reserved slot indicated by queueFront

15 C++ Programming: Program Design Including Data Structures, Fourth Edition

Empty Queue and Full Queue

C++ Programming: Program Design Including Data Structures, Fourth Edition 18

Initialize Queue

C++ Programming: Program Design Including Data Structures, Fourth Edition 19

Front

• Returns the first element of the queue

C++ Programming: Program Design Including Data Structures, Fourth Edition 20

Back

• Returns the last element of the queue

C++ Programming: Program Design Including Data Structures, Fourth Edition 21

addQueue

C++ Programming: Program Design Including Data Structures, Fourth Edition 22

deleteQueue

C++ Programming: Program Design Including Data Structures, Fourth Edition 23

Constructors and Destructors

C++ Programming: Program Design Including Data Structures, Fourth Edition 24

Constructors and Destructors

(continued)

• The array to store the queue elements is created dynamically

− When the queue object goes out of scope, the destructor simply deallocates the memory occupied by the array

C++ Programming: Program Design Including Data Structures, Fourth Edition 25

Linked Implementation of Queues

• Array size is fixed: only a finite number of queue elements can be stored in it

• The array implementation of the queue requires array to be treated in a special way

− Together with queueFront and queueRear

• The linked implementation of a queue simplifies many of the special cases of the array implementation

− In addition, the queue is never full

C++ Programming: Program Design Including Data Structures, Fourth Edition 26

Linked Implementation of Queues

(continued)

• Elements are added at one end and removed from the other

− We need to know the front of the queue and the rear of the queue

• Two pointers: queueFront and queueRear

C++ Programming: Program Design Including Data Structures, Fourth Edition 27

Empty and Full Queue

• The queue is empty if queueFront is NULL

• The queue is never full

C++ Programming: Program Design Including Data Structures, Fourth Edition 30

Initialize Queue

• Initializes queue to an empty state

− Must remove all the elements, if any

C++ Programming: Program Design Including Data Structures, Fourth Edition 31

addQueue

C++ Programming: Program Design Including Data Structures, Fourth Edition 32

front

and

back

Operations

C++ Programming: Program Design Including Data Structures, Fourth Edition 33

deleteQueue

C++ Programming: Program Design Including Data Structures, Fourth Edition 34

Default Constructor

C++ Programming: Program Design Including Data Structures, Fourth Edition 35

Summary

• Stack: items are added/deleted from one end

− Last In First Out (LIFO) data structure

− Operations: push, pop, initialize, destroy, check for empty/full stack

− Can be implemented as array or linked list

− Middle elements should not be accessed

• Postfix notation: operators are written after the operands (no parentheses needed)

C++ Programming: Program Design Including Data Structures, Fourth Edition 36

Summary (continued)

• Queue: items are added at one end and removed from the other end

− First In First Out (FIFO) data structure

− Operations: add, remove, initialize, destroy, check if queue is empty/full

− Can be implemented as array or linked list

− Middle elements should not be accessed

− Restricted versions of arrays and linked lists

C++ Programming: Program Design Including Data Structures, Fourth Edition 37

Download