Imagine students are sitting in the counselling office on a row of chairs, waiting to talk to the counselor.. Each new student sits behind the last student. There are 5 chairs.
>> Empty (beginning of the day) :______: :_____: :_____: :_____: :_____: 1 2 3 4 5 >> First student arrives (Al) :__Al__: :_____: :_____: :_____: :_____: 1 2 3 4 5 >> Second student arrives (Betty) :__Al__: :_Betty_: :_____: :_____: :_____: 1 2 3 4 5 |>> Al goes into the counselor's office :______: :_Betty_: :_____: :_____: :_____:
1 2 3 4 5
>> Carla arrives :______: :_Betty_: :_Carla_: :_____: :_____:
1 2 3 4 5
>> Doug arrives :______: :_Betty_: :_Carla_: :_Doug_: :_____:
1 2 3 4 5
>> Betty goes into counselor's office :______: :_______: :_Carla_: :_Doug_: :_____:
1 2 3 4 5
Question 1: Who is "next in line" to see the counselor now?
Question 2: What happens if 2 more students come into the office?
Where should they sit?
If the students are not very organized, or if the chairs are scattered
around, or if there are lots more chairs,
it might be useful to have a computer where the students "sign in".
Then they can sit wherever they like.
Indeed, they could go back outside for a few minutes without "losing their
place."
Whenever a student leaves, the counselor presses the "next" button on the
computer,
and it tells who is next in line.
The WAITING program uses a queue
to keep track of students waiting in the counselor's office.
A queue is a FIFO data structure = First In, First Out.
Notice that the subroutines are generic – that is, the operations Initialize, EnQueue, and Dequeue would be needed in any queue in any application. The same ideas could be used to manage a queue of patients in a doctor's office, a queue of print jobs in a print server (spooling), and in many other practical situations.
Question 3: What is the
meaning of the variables Head and Tail?
How
many "chairs" does the program have?
Notice that the DeQueue command is a Function. Why? Because it outputs a name, so it returns a result. On the other hand, the EnQueue command accepts an Input Parameter – the name which is entering (input) the queue.
Question 4: It is quite possible that the Queue will overflow. This could be solved by allocating more memory. However, as the day progresses, the data "crawls" through the queue, so even with 100 positions it is conceivable that the Tail pointer could overflow. Suggest a solution to this problem. Which method must be changed?
/**************************************************\ WAITING QUEUE This program inputs names and adds them to a QUEUE. When the Leave button is clicked, it gets retrieves the name from the HEAD of the queue and displays it. This is useful for keeping a queue of names for people waiting for a service, for example in a doctor's office. \**************************************************/ public class WaitingQueue { String[] queue = new String[10]; int head, tail; public WaitingQueue() { initialize(); String command = ""; while(true) { command = input("In/Out/Quit"); command = command.toUpperCase(); if(command.equals("IN")) { String newName = input("Type name to be added to the queue:"); enqueue(newName); display(); } if(command.equals("OUT")) { String name = dequeue(); output("Next person is " + name); display(); } if(command.equals("QUIT")) { System.exit(0); display(); } } } void initialize() { head = 0; tail = -1; } void enqueue(String thisName) { tail = tail + 1; queue[tail] = thisName; } String dequeue() { if(head <= tail) { String name = queue[head]; head = head + 1; return name; } else { return ""; } } void display() { String answer = ""; for(int x = head; x <= tail; x = x+1) { answer = answer + queue[x] + "\n"; } output(answer); } public static void main(String[] args) { new WaitingQueue(); } public void output(String message) { javax.swing.JOptionPane.showMessageDialog(null,message); } public String input(String prompt) { return javax.swing.JOptionPane.showInputDialog(null,prompt); } } |
In our counselling office, there are actually three
counselors – Starns, Reeves, and Kraus.
Kraus takes care of grades 7 and 9, Reeves takes care of grades 6, 8,
and 10, and Starns takes care
of grades 11 and 12.
To add a second queue, the functions and procedures must
all be duplicated and changed.
Problem 5: Add all the necessary code to create a program with 2 queues. If you manage that correctly, you probably don't need to make the third queue.
Problem 6: What if a teacher comes in and wants to "cut in line"? How can the program place a teacher at the front of the line (but the teacher must still wait until the student leaves the counselor's office)?
Problem 7: What does the following procedure do to the students in the queue?
void problem()
{
String temp; temp = queue[head]; queue[head] = queue[tail]; queue[tail] = temp;
}
What happens if the problem procedure runs when the queue is empty?
Problem 8: What does the following function do?
String cheater()
{
tail = tail - 1;
cheater = queue[tail];
}
Problem 9: Without
using the computer, write a method which
exchanges the 1st and 2nd names
in the queue, thus "moving up" the 2nd
person to the head of the line.
Problem 10: Find out what a stack is, and how it behaves differently from a queue.