Chapter 18-3

Download Report

Transcript Chapter 18-3

C++ Programming:
Program Design Including
Data Structures, Fourth Edition
Chapter 18: Stacks and Queues
(part 3)
Queues
• Queue: list 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
6
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
7
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
8
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...
C++ Programming: Program Design Including Data Structures, Fourth Edition
9
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
10
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
11
Implementation of Queues as
Arrays (continued)
• To advance the index in a (logically) circular
array:
C++ Programming: Program Design Including Data Structures, Fourth Edition
12
Implementation of Queues as
Arrays (continued)
C++ Programming: Program Design Including Data Structures, Fourth Edition
13
Implementation of Queues as
Arrays (continued)
• Case 1:
C++ Programming: Program Design Including Data Structures, Fourth Edition
14
Implementation of Queues as
Arrays (continued)
• Case 2:
C++ Programming: Program Design Including Data Structures, Fourth Edition
15
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
16
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
C++ Programming: Program Design Including Data Structures, Fourth Edition
17
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
C++ Programming: Program Design Including Data Structures, Fourth Edition
18
Implementation of Queues as
Arrays (continued)
C++ Programming: Program Design Including Data Structures, Fourth Edition
19
Empty Queue and Full Queue
C++ Programming: Program Design Including Data Structures, Fourth Edition
22
Initialize Queue
C++ Programming: Program Design Including Data Structures, Fourth Edition
23
Front
• Returns the first element of the queue
C++ Programming: Program Design Including Data Structures, Fourth Edition
24
Back
• Returns the last element of the queue
C++ Programming: Program Design Including Data Structures, Fourth Edition
25
addQueue
C++ Programming: Program Design Including Data Structures, Fourth Edition
26
deleteQueue
C++ Programming: Program Design Including Data Structures, Fourth Edition
27
Constructors and Destructors
C++ Programming: Program Design Including Data Structures, Fourth Edition
28
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
29
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
30
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
31
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
34
Initialize Queue
• Initializes queue to an empty state
− Must remove all the elements, if any
C++ Programming: Program Design Including Data Structures, Fourth Edition
35
addQueue
C++ Programming: Program Design Including Data Structures, Fourth Edition
36
front and back Operations
C++ Programming: Program Design Including Data Structures, Fourth Edition
37
deleteQueue
C++ Programming: Program Design Including Data Structures, Fourth Edition
38
Default Constructor
C++ Programming: Program Design Including Data Structures, Fourth Edition
39
Queue Derived from the class
unorderedLinkedListType
• The linked implementation of a queue is
similar to the implementation of a linked list
created in a forward manner
− addQueue is similar to insertFirst
− initializeQueue is like initializeList
− isEmptyQueue is similar to isEmptyList
− deleteQueue can be implemented as before
− queueFront is the same as first
− queueRear is the same as last
C++ Programming: Program Design Including Data Structures, Fourth Edition
41
Queue Derived from unordered
LinkedListType (continued)
• We can derive the class to implement the
queue from linkedListType
− Abstract class: does not implement all the
operations
• However, unorderedLinkedListType is
derived from linkedListType
− Provides the definitions of the abstract
functions of the linkedListType
− Therefore, we can derive linkedQueueType
from unorderedLinkedListType
C++ Programming: Program Design Including Data Structures, Fourth Edition
42
Application of Queues: Simulation
• Simulation: a technique in which one system
models the behavior of another system
• Computer simulations using queues as the
data structure are called queuing systems
C++ Programming: Program Design Including Data Structures, Fourth Edition
43
Designing a Queuing System
• Server: the object that provides the service
• Customer: the object receiving the service
• Transaction time: service time, or the time it
takes to serve a customer
• Model: system that consists of a list of
servers and a waiting queue holding the
customers to be served
− Customer at front of queue waits for the
next available server
C++ Programming: Program Design Including Data Structures, Fourth Edition
44
Designing a Queuing System
(continued)
• We need to know:
− Number of servers
− Expected arrival time of a customer
− Time between the arrivals of customers
− Number of events affecting the system
• Performance of system depends on:
− How many servers are available
− How long it takes to serve a customer
− How often a customer arrives
C++ Programming: Program Design Including Data Structures, Fourth Edition
45
Designing a Queuing System
(continued)
• If it takes too long to serve a customer and
customers arrive frequently, then more
servers are needed
• System can be modeled as a time-driven
simulation
• Time-driven simulation: the clock is a counter
− The passage of, say, one minute can be
implemented by incrementing the counter by 1
− Simulation is run for a fixed amount of time
C++ Programming: Program Design Including Data Structures, Fourth Edition
46
Customer
C++ Programming: Program Design Including Data Structures, Fourth Edition
47
Server
C++ Programming: Program Design Including Data Structures, Fourth Edition
48
Server List
• A server list is a set of servers
− At a given time, a server is either free or busy
C++ Programming: Program Design Including Data Structures, Fourth Edition
49
Waiting Customers Queue
• When a customer arrives, he/she goes to the
end of the queue
• When a server becomes available, the
customer at front of queue leaves to conduct
the transaction
• After each time unit, the waiting time of each
customer in the queue is incremented by 1
• We can use queueType but must add the
operation of incrementing the waiting time
C++ Programming: Program Design Including Data Structures, Fourth Edition
50
Waiting Customers Queue
(continued)
C++ Programming: Program Design Including Data Structures, Fourth Edition
51
Main Program
• Algorithm:
− Declare and initialize the variables
− Main loop (see next slide)
− Print results
C++ Programming: Program Design Including Data Structures, Fourth Edition
52
Main Program (continued)
C++ Programming: Program Design Including Data Structures, Fourth Edition
53
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
54
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
55