public interface IQueue<T> {
int count();
// 队列是否为空
boolean isEmpty();
void clear();
// 添加元素到队尾
void add(T item);
// 出队
T out();
T getFront();
}
CSeqQueue.java
public class CSeqQueue<T> implements IQueue<T> {
private T[]data;
private int maxsize;
private int front;
private int rear;
public CSeqQueue(int maxsize){
data = (T[]) new Object[maxsize];
this.maxsize=maxsize;
front =rear=0;
}
@Override
public int count() {
return (rear - front - maxsize) % maxsize;
}
@Override
public boolean isEmpty() {
return front == rear;
}
@Override
public void clear() {
front = rear;
}
@Override
public void add(T item) {
if ((rear +1 + maxsize) % maxsize == front) {
System.out.println("队列已满!");
return;
}
rear = (rear +1) % maxsize;
data[rear] = item;
}
@Override
public T out() {
if (isEmpty()) {
throw new RuntimeException("队列已经满了!");
}
front = (front + 1) % maxsize;
return data[front];
}
@Override
public T getFront() {
if (isEmpty()) {
throw new RuntimeException("队列已经满了!");
}
return data[front + 1];
}
}
public class Node<T> {
T data;
Node<T> next;
public Node() {
}
public Node(T data) {
this.data = data;
this.next = null;
}
}
LinkQueue.java
public class LinkQueue<T> implements IQueue<T> {
private Node<T> front;
private Node<T> rear;
public LinkQueue() {
front = rear = new Node<T>();
}
@Override
public int count() {
Node<T> p = front;
int len = 0;
while (p != null) {
++len;
p = p.next;
}
return len-1;
}
@Override
public boolean isEmpty() {
return front.next == null;
}
@Override
public void clear() {
front.next = null;
rear = front;
}
@Override
public void add(T item) {
Node<T> q = new Node<T>(item);
rear.next = q;
rear = q;
}
@Override
public T out() {
if (isEmpty()) {
throw new RuntimeException("Queue is empty");
}
Node<T> p = front.next;
front.next = p.next;
if (count() == 0) {
rear = front;
}
return p.data;
}
@Override
public T getFront() {
if (isEmpty()) {
throw new RuntimeException("Queue is empty");
}
Node<T> p = front.next;
return p.data;
}
}