队列:先进先出,使用于排队系统,例如:文件的下载,短信发送等。
下面是一个利用数组实现队列的例子
package com.notepad;
import java.util.Arrays;
public class MyQueue<T>
{
private int DEFAULT_SIZE = 5;
private int capacity;
private Object[] elementsData;
private final int front = 0;
private int rear = 0;
// 几种不同的初始化
// 1. 初始化一个空队列,默认size
public MyQueue()
{
this.capacity = DEFAULT_SIZE;
this.elementsData = new Object[capacity];
}
// 2. 初始化包含一个元素的队列, 默认size
public MyQueue(T element)
{
super();
elementsData[front] = element;
rear++;
}
// 3. 初始化包含一个元素的队列, 同时初始化size
public MyQueue(T element, int size)
{
this.capacity = size;
this.elementsData = new Object[capacity];
elementsData[front] = element;
rear++;
}
// 所有需要实现的方法:1.size 2.add 3.remove 4.element 5.empty 6.clear 7.toString
// 1.size
public int size()
{
return rear - front;
}
// 2.add
public void add(T element)
{
// 如果超过队列长度,抛异常
if(rear > capacity -1)
{
throw new IndexOutOfBoundsException("the queue is full!");
}
elementsData[rear++] = element;
}
// 3.remove
public T remove()
{
// 判空
if(empty())
{
throw new IndexOutOfBoundsException("queue is empty!");
}
// 可以使System.arraycopy来remove
@SuppressWarnings("unchecked")
T oldValue = (T)elementsData[front];
System.arraycopy(elementsData, front+1, elementsData, front, rear-1);
elementsData[rear-1] = null;
rear--;
return oldValue;
}
// 4.element
@SuppressWarnings("unchecked")
public T element()
{
// 判空
if(empty())
{
throw new IndexOutOfBoundsException("queue is empty!");
}
return (T) elementsData[front];
}
// 5.empty
public boolean empty()
{
return front == rear;
}
// 6.clear
public void clear()
{
Arrays.fill(elementsData, null);
rear = 0;
}
// 7.toString
@Override
public String toString()
{
if(empty())
{
return "[]";
}
else {
StringBuffer sb = new StringBuffer("[");
for(int i = front; i<rear; i++)
{
sb.append(elementsData[i]).append(", ");
}
int len = sb.length();
return sb.delete(len-2, len).append("]").toString();
}
}
public static void main(String[] args)
{
MyQueue<Integer> queue = new MyQueue<Integer>(1, 5);
queue.add(2);
queue.add(3);
queue.add(4);
queue.add(5);
// 这里会自动调用toString方法,我不知道为什么。
System.out.println(queue);
System.out.println(queue.toString());
System.out.println(queue.empty());
System.out.println(queue.size());
System.out.println(queue.element());
queue.remove();
queue.remove();
System.out.println(queue);
System.out.println(queue.empty());
System.out.println(queue.size());
System.out.println(queue.element());
queue.clear();
System.out.println(queue.empty());
System.out.println(queue.size());
}
}