From charlesreid1

(Created page with "Link: https://charlesreid1.com:3000/cs/java/src/master/stacks-queues-deques/queues/LinkedQueue.java LinkedQueue is a linked list based queue class implemented in Java. ==In...")
 
No edit summary
Line 3: Line 3:
LinkedQueue is a linked list based queue class implemented in Java.  
LinkedQueue is a linked list based queue class implemented in Java.  


==Interface==
==Code==
 
===Interface===


This class implements the standard queue methods:
This class implements the standard queue methods:
Line 14: Line 16:
* rotate (rotate moves one element from front of queue to rear of queue)
* rotate (rotate moves one element from front of queue to rear of queue)


==Test==
===Test===


Here is a test of the LinkedQueue object that shows how it works; this manipulates a queue of integers.
Here is a test of the LinkedQueue object that shows how it works; this manipulates a queue of integers.
Line 55: Line 57:
}
}


</pre>
===Implementation===
<pre>
class LinkedQueue {
Node<E> tail;
int size;
public LinkedQueue() {
size = 0;
};
public int size() { return size; }
public boolean isEmpty() { return (size==0); }
public String toString() {
StringBuffer sb = new StringBuffer();
if(isEmpty()) {
return "[ EMPTY QUEUE ]";
} else {
sb.append("[ ");
Node<E> runner = tail.getNext();
int k = 0;
while(k<size && runner != null) {
sb.append(runner);
sb.append(" ");
k++;
runner = runner.getNext();
}
sb.append(" ]");
return sb.toString();
}
};
/** Add item e to the back of the linked list. */
public void enqueue(E e) {
if(isEmpty()) {
Node<E> newtail = new Node<E>(e);
// everybody point at the new node
tail = newtail;
// tail will link to itself in a 1 item list
tail.setNext(tail);
} else {
Node<E> newtail = new Node<E>(e, tail.getNext());
// link the new tail
tail.setNext(newtail);
// advance tail pointer
tail = tail.getNext();
}
size++;
}
/** Remove item e from the front of the linked list. */
public E dequeue() {
if(isEmpty()) {
throw new Empty();
} else if(size==1) {
E res = tail.getData();
tail = null;
size--;
return res;
} else {
// length of list is at least 2 items.
// if length = 2, we will end up linking tail to itself, which is fine.
Node<E> rm = tail.getNext();
Node<E> newhead = rm.getNext();
tail.setNext(newhead);
size--;
return rm.getData();
}
}
/** Rotate the deque by skipping the next item in line and putting it in back. */
public void rotate() {
if(isEmpty()) {
throw new Empty();
}
// The whole point of using a circular linked list is to avoid creating
// a new node to do this kind of operation.
// So don't call enqueue(dequeue()) !!!
//
// Simply advance the tail pointer forward by one.
tail = tail.getNext();
}
}
</pre>
</pre>

Revision as of 05:53, 4 June 2017

Link: https://charlesreid1.com:3000/cs/java/src/master/stacks-queues-deques/queues/LinkedQueue.java

LinkedQueue is a linked list based queue class implemented in Java.

Code

Interface

This class implements the standard queue methods:

  • add/enqueue
  • remove/dequeue

as well as the convenience methods:

  • size
  • isEmpty
  • rotate (rotate moves one element from front of queue to rear of queue)

Test

Here is a test of the LinkedQueue object that shows how it works; this manipulates a queue of integers.

	public static void main(String[] args) {
		LinkedQueue<Integer> q = new LinkedQueue<Integer>();
		System.out.println(q);

		q.enqueue(100);
		q.enqueue(100);
		q.enqueue(100);
		System.out.println(q);

		for(int i=0; i<10; i++) { 
			q.enqueue(i);
		}
		System.out.println(q);

		q.dequeue();
		q.dequeue();
		q.dequeue();
		System.out.println(q);

		for(int i=0; i<3; i++) { 
			q.dequeue();
		}
		System.out.println(q);

		System.out.println("Rotate:");
		q.rotate();
		System.out.println(q);
		q.rotate();
		System.out.println(q);
		q.rotate();
		System.out.println(q);
		
		System.out.println("Size = " + q.size());

	}

Implementation

class LinkedQueue {

	Node<E> tail;
	int size;

	public LinkedQueue() {
		size = 0;
	};

	public int size() { return size; }
	public boolean isEmpty() { return (size==0); }

	public String toString() { 
		StringBuffer sb = new StringBuffer();
		if(isEmpty()) {
			return "[ EMPTY QUEUE ]";
		} else {
			sb.append("[ ");
			Node<E> runner = tail.getNext();
			int k = 0;
			while(k<size && runner != null) {
				sb.append(runner);
				sb.append(" ");
				k++;
				runner = runner.getNext();
			}
			sb.append(" ]");
			return sb.toString();
		}
	};

	/** Add item e to the back of the linked list. */
	public void enqueue(E e) { 
		if(isEmpty()) {		

			Node<E> newtail = new Node<E>(e);

			// everybody point at the new node
			tail = newtail;

			// tail will link to itself in a 1 item list
			tail.setNext(tail);

		} else {

			Node<E> newtail = new Node<E>(e, tail.getNext());

			// link the new tail 
			tail.setNext(newtail);

			// advance tail pointer
			tail = tail.getNext();

		}
		size++;
	}

	/** Remove item e from the front of the linked list. */
	public E dequeue() { 

		if(isEmpty()) {
			throw new Empty();

		} else if(size==1) { 
			E res = tail.getData();
			tail = null;
			size--;
			return res;

		} else {

			// length of list is at least 2 items.
			// if length = 2, we will end up linking tail to itself, which is fine.
			Node<E> rm = tail.getNext();
			Node<E> newhead = rm.getNext();

			tail.setNext(newhead);
			size--;
			return rm.getData();
		}
	}


	/** Rotate the deque by skipping the next item in line and putting it in back. */
	public void rotate() { 
		if(isEmpty()) { 
			throw new Empty();
		}

		// The whole point of using a circular linked list is to avoid creating 
		// a new node to do this kind of operation.
		// So don't call enqueue(dequeue()) !!!
		// 
		// Simply advance the tail pointer forward by one.
		tail = tail.getNext();
	}


}