链表实现,插入节点放最后就行了。
代码:
package nuaa.ds;
import java.util.NoSuchElementException;
public class LinkedQueue<T> {
private Node<T> head;
private Node<T> tail;
private int size;
public void enqueue(T t){
if(null==t){
throw new IllegalArgumentException();
}
if(size==0){
head = new Node<T>(t);
tail = head;
size++;
return;
}
Node<T> p = new Node<T>(t);
tail.next = p;
tail = p;
size++;
}
public T dequeue(){
if(size==0){
throw new NoSuchElementException();
}
Node<T> p = head;
head = head.next;
return p.u;
}
public LinkedQueue(){
this.size = 0;
}
public boolean isEmpty(){
return size==0 ? true : false;
}
public T element(){
return head.u;
}
public int size(){
return size;
}
class Node<U>{
U u;
Node<U> next;
public Node(U u) {
super();
this.u = u;
}
}
}
数组实现循环队列:
分离出满和空单独讨论,满就doble size,空了就把索引head tail都置为-1
代码:
package nuaa.ds;
import java.util.NoSuchElementException;
public class Queue<E> {
private Object[] arrays = new Object[this.capacity]; //holds the objects
private int size=0; //current size
private int capacity = 2; //default capacity
private int head = -1; //location of the head of queue
private int tail = -1; //location of the tail of queue
public void enqueue(E e) {
if(null==e){
throw new IllegalArgumentException("e is null");
}
if(this.size()>=this.capacity||arrays.length==0){// arrays is full
Object[] old = this.arrays;
this.capacity = 2*this.capacity;
this.arrays = new Object[this.capacity];
this.head = 0;
this.tail = old.length-1;
for(int i=0;i<old.length;i++){//copy the elements
arrays[i] = old[i];
}
//add the element
this.tail++;
}else{// not full
if(head==-1&&tail==-1){//empty
this.head = 0;
this.tail = 0;
}else if(head<tail){
if(tail==capacity-1){//tail is at the end of the arrays
this.tail = 0;
}else{
tail++;
}
}else{//head>tail
tail++;
}
}
this.size++;
arrays[tail] = e;
}
public E dequeue() {
if(size==0){//empty
throw new NoSuchElementException();
}
if(size==1){//only 1 element
this.head = -1;
this.tail = -1;
this.size--;
return (E)this.arrays[tail];
}
if(head==capacity-1){
this.head = 0;
this.size--;
return (E)arrays[capacity-1];
}
this.size--;
this.head++;
return (E)arrays[head-1];
}
public boolean isEmpty(){
return size==0 ? true : false;
}
public int size() {
return this.size;
}
}