/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* Queue.java
* Copyright (C) 1999 Len Trigg
*
*/
package weka.core;
import java.io.*;
/**
* Class representing a FIFO queue.
*
* @author Len Trigg (trigg@cs.waikato.ac.nz)
* @version $Revision: 1.1.1.1 $
*/
public class Queue extends Object implements Serializable {
/**
* Represents one node in the queue.
*/
protected class QueueNode implements Serializable {
/** The next node in the queue */
protected QueueNode m_Next;
/** The nodes contents */
protected Object m_Contents;
/**
* Creates a queue node with the given contents
*/
public QueueNode(Object contents) {
m_Contents = contents;
next(null);
}
/**
* Sets the next node in the queue, and returns it.
*/
public QueueNode next(QueueNode next) {
return m_Next = next;
}
/**
* Gets the next node in the queue.
*/
public QueueNode next() {
return m_Next;
}
/**
* Sets the contents of the node.
*/
public Object contents(Object contents) {
return m_Contents = contents;
}
/**
* Returns the contents in the node.
*/
public Object contents() {
return m_Contents;
}
}
/** Store a reference to the head of the queue */
protected QueueNode m_Head = null;
/** Store a reference to the tail of the queue */
protected QueueNode m_Tail = null;
/** Store the current number of elements in the queue */
protected int m_Size = 0;
/**
* Removes all objects from the queue.
*/
public final synchronized void removeAllElements() {
m_Size = 0;
m_Head = null;
m_Tail = null;
}
/**
* Appends an object to the back of the queue.
*
* @param item the object to be appended
* @return the object appended
*/
public synchronized Object push(Object item) {
QueueNode newNode = new QueueNode(item);
if (m_Head == null) {
m_Head = m_Tail = newNode;
} else {
m_Tail = m_Tail.next(newNode);
}
m_Size++;
return item;
}
/**
* Pops an object from the front of the queue.
*
* @return the object at the front of the queue
* @exception RuntimeException if the queue is empty
*/
public synchronized Object pop() {
if (m_Head == null) {
throw new RuntimeException("Queue is empty");
}
Object retval = m_Head.contents();
m_Size--;
m_Head = m_Head.next();
if (m_Head == null) {
m_Tail = null;
}
return retval;
}
/**
* Gets object from the front of the queue.
*
* @return the object at the front of the queue
* @exception RuntimeException if the queue is empty
*/
public synchronized Object peek() {
if (m_Head == null) {
throw new RuntimeException("Queue is empty");
}
return m_Head.contents();
}
/**
* Checks if queue is empty.
*
* @return true if queue is empty
*/
public boolean empty() {
return (m_Head == null);
}
/**
* Gets queue's size.
*
* @return size of queue
*/
public int size() {
return m_Size;
}
/**
* Produces textual description of queue.
*
* @return textual description of queue
*/
public String toString() {
String retval = "Queue Contents "+m_Size+" elements\n";
QueueNode current = m_Head;
if (current == null) {
return retval + "Empty\n";
} else {
while (current != null) {
retval += current.contents().toString()+"\n";
current = current.next();
}
}
return retval;
}
/**
* Main method for testing this class.
*
* @param argv a set of strings that are pushed on a test queue
*/
public static void main(String [] argv) {
try {
Queue queue = new Queue();
for(int i = 0; i < argv.length; i++) {
queue.push(argv[i]);
}
System.out.println("After Pushing");
System.out.println(queue.toString());
System.out.println("Popping...");
while (!queue.empty()) {
System.out.println(queue.pop().toString());
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}