github 地址:https://github.com/heng1234/data-structure
接口:
package com.company.Queue;
/**
* Queue
* 隊列接口
* @author heng
**/
public interface Queue<E>{
/**
* 存入隊列中
* @param e
*/
void enqueue(E e);
/**
* 從隊列中取出一個元素 出隊
* @return
*/
E dequeue();
/**
* 拿到隊首
* @return
*/
E getFront();
/**
* 大小
* @return
*/
int getSize();
/**
* 是否爲空
* @return
*/
boolean isEmpty();
}
實現類:
package com.company.Queue;
/**
* LoopQueue
* 循環隊列的實現
* 循環隊列需要從底層寫起 不再用Array類了
* @author heng
* @date 2019/10/2
**/
public class LoopQueue<E> implements Queue<E> {
/**
* 存儲數組
*/
private E[] data;
/**
* front指的是隊首
* tail指的是隊列裏的最後一個元素的下一個位置
*/
private int front,tail;
/**
* 存在多少個元素
*/
private int size;
/**
* 這裏需要浪費一個空間 所以用戶傳入的大小需要+1
* @param capacity
*/
public LoopQueue(int capacity){
data = (E[]) new Object[capacity+1];
front = 0;
tail = 0;
size = 0;
}
public LoopQueue(){
this(10);
}
/**
* 返回數組大小
* 因爲浪費了一個所以需要-1
* @return
*/
public int getCapacity(){
return data.length - 1;
}
/**
* 入隊
* @param e
*/
@Override
public void enqueue(E e) {
if ((tail + 1) % data.length == front){
resize(getCapacity() * 2);
}
data[tail] = e;
tail = (tail + 1) % data.length;
size++;
}
/**
* 擴容
* @param newCapatity
*/
private void resize(int newCapatity) {
E[] newData = (E[]) new Object[newCapatity+1];
for (int i = 0; i < size; i++) {
newData[i] = data[(i+front) % data.length];
}
data = newData;
front = 0;
tail = size;
}
/**
* 出隊
* @return
*/
@Override
public E dequeue() {
if(isEmpty()){
throw new IllegalArgumentException("Cannot dequeue from an empty.");
}
E ret = data[front];
data[front] = null;
front = (front + 1) % data.length;
size --;
/**
* 縮容
*/
if (size == getCapacity() / 4 && getCapacity() / 2 != 0){
resize(getCapacity() / 2);
}
return ret;
}
/**
* 拿到隊首
* @return
*/
@Override
public E getFront() {
if(isEmpty()){
throw new IllegalArgumentException("Queue is empty.");
}
return data[front];
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return front == tail;
}
@Override
public String toString(){
StringBuilder builder = new StringBuilder();
builder.append(String.format("Queue: size = %d , capacaity = %d\n",size,getCapacity()));
builder.append("front[ ");
for (int i = front; i != tail; i=(i+1) % data.length) {
builder.append(data[i]);
if ((i+1)% data.length != tail){
builder.append(" , ");
}
}
builder.append(" ]tail");
return builder.toString();
}
}
測試:
public static void main(String[] args) {
LoopQueue<Integer> queue = new LoopQueue<>();
for (int i = 0; i < 12; i++) {
queue.enqueue(i);
System.out.println(queue);
if (i == 5 || i == 7){
queue.dequeue();
System.out.println(queue);
}
}
}