Queue Data Structure
Queue Data Structure
What is queue?
◼ A queue is a linier data structure.
The concept is quite similar with
stack.
◼ additions are made at the end or tail
of the queue while removals are
made from the front or head of the
queue.
◼ Access system a queue is referred to
a FIFO structure (First-In First-Out)
Queue operations
◼ Add : adds a new node
Add(X,Q) → add the value X to the tail of queue
◼ Remove : removes a node
Remove(Q) → removes the head node and returns
its value
◼ IsEmpty : reports whether the queue is
empty
IsEmpty(Q) → report whether the queue Q is empty
◼ IsFull : reports whether the queue is
full
IsFull(Q) → report whether the queue Q is full
◼ Initialize : creates/initializes the queue
Initialize(Q) → create a new empty queue named Q
◼ Destroy : deletes the contents of the
queue (may be implemented by re-
initializing the queue)
Destroy(Q) → deletes the contents of the queue Q
Illustration/example
Operation Queue’s contents Return value
1. Initialiaze(S) <empty> -
2. Add(A,Q) A -
3. Add(B,Q) A B -
4. Add(C,Q) A B C -
5. Remove(Q) B C A
6. Add(D,Q) B C D -
7. Remove(Q) C D B
8. Remove(Q) D C
9. Remove(Q) <empty> D
Exercise: Queue Operation
What would the contents of a queue be
after the following operations?
Initialise(Q)
Add(A,Q)
Add(F,Q)
Add(X,Q)
Remove(Q)
Add(B,Q)
Remove(Q)
Remove(Q)
→B
Storing a queue in a static data
structure
◼ This implementation stores the queue in an array.
◼ The array indices at which the head and tail of the
queue are currently stored must be maintained.
◼ The head of the queue is not necessarily at index 0.
The array can be a “circular array” – the queue “wraps
round” if the last index of the array is reached.
Example – storing a queue in an array of length 5
Storing a queue in a static data
structure (2)
/*class QueueTester. */
public class QueueTester
{
private Queue queue;
public QueueTester(){
queue = new Queue();
}
public QueueTester(Queue queue){
this.queue = queue;
}
void addString(String str)
void removeString()
} void checkIfEmpty()
void listStringsInQueue()
Using a Queue (2)
/* check if queue is empty */
/* add item to queue */ public void checkIfEmpty() {
public void addString(String if (queue.isEmpty())
str) { System.out.println("Queue empty");
queue.add(str); else
System.out.println("Queue is not
System.out.println("Added empty");
new string"); }
}
/* list the strings in queue */
public void listStringsInQueue() {
/* remove item from queue */ if (queue.isEmpty()) {
public void removeString() { System.out.println("Queue
String result = (String) empty");
queue.remove(); }
else {
if (result!=null) System.out.println("Strings in
System.out.println("String is queue are: ");
:" + result); System.out.println();
Node node = queue.head;
else
while (node != null){
String item =
System.out.println("Remove (String)node.dataItem;
was unsuccessful"); System.out.println(item);
} node = node.nextNode;
}
System.out.println();
}
}
Exercise: Using a Queue
◼ Create a new BlueJ project called queues and create new
classes Node, Queue and QueueTester using the above
code.
◼ Create a new instance of Queue.
◼ Create a new instance of QueueTester and select your
Queue instance in the object bench as the parameter in the
constructor. This means that you will be testing the Queue
you created in the previous step.
◼ Call the checkIfEmpty method of your QueueTester.
What was the result?
◼ Call the addString method of your QueueTester to add the
string “The” to the queque.
◼ Repeat this to add the following strings: “queue”, “gets”,
“longer”
What result would you expect if you remove from the
Queue?
◼ Call the removeString method of your QueueTester and
check that you got the correct result.
◼ Call the add method of your QueueTester to add the strings
“every” and “day” to the queue.
What do you expect the contents of the Queue to be now?
◼ Inspect your Queue object. You should see references to the
head and tail of the Queue.
For Your EXERCISE:
Storing other types of data
◼ Modify the QueueTester class to
store Double objects in a Queue
instead of String objects, and test in
a similar way to the above.
◼ You should not have to change the
Queue class at all.
EXERCISE: A practical application
of the Queue class
◼ A queue is a useful data structure for holding data which
should be processed in the order it is created, but which
cannot always be processed straight away. A typical
application might be a messaging system. In the following
example, messages are received in the order they were
sent.
◼ The classes involved are Message, MessageSender and
MessageReceiver:
⚫ A Message object has a sender, a recipient, a content string
and a date.
⚫ A Message is placed in a Queue by a MessageSender
object.
⚫ A Message is removed from the queue by a
MessageReceiver object, which can also display the
contents of the Queue.
◼ The Queue class you have created in this chapter can
hold any type of object, including Messages, so you can
use it in this example as it is.
◼ Add the following classes to your queues project:
EXERCISE: A practical application (the code)
Message.Java
import java.text.*;
import java.util.Date;
/** class Message */
public class Message
{
public String sender;
public String recipient;
public String content;
public Date date;
/**class MessageSender. */
public class MessageSender
{
/** places a message on a specified queue */
public void sendMessage(String sender, String recipient, String content, Queue q)
{
Message m = new Message(sender, recipient, content);
if(!q.isFull()){
q.add(m);
System.out.println("Message placed on queue");
}
else
System.out.println("Cannot send - queue is full");
}
}
EXERCISE: A practical application (the code)
MessageReceiver.Java