1 概述
隊列是一種先進先出的數據結構,本文將基於鏈表實現一種簡單的隊列,主要功能包括入隊,出隊。
2 代碼實現
package com.niuniu.studyalgorithm;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;
/**
* @author 002991
* 基於鏈表的自定義隊列
*/
public class ChainQueue<Item> implements Iterable<Item> {
/**
* 指向最早添加的節點的鏈接
*/
private Node first;
/**
* 指向最近添加的節點的鏈接
*/
private Node last;
/**
* 節點的數量
*/
private int size;
/**
* 判斷隊列是否爲空
* @return
*/
public boolean isEmpty(){
return first == null;
}
/**
* 獲取隊列的長度
* @return
*/
public int size(){
return size;
}
/**
* 向隊列中添加元素
* @param item
*/
public void enqueue(Item item){
Node oldLast = last;
last = new Node();
last.item = item;
last.next = null;
if(isEmpty()){
first = last;
}else{
oldLast.next = last;
}
size++;
}
/**
* 從隊列中獲取元素
* @return
*/
public Item dequeue(){
Item item = first.item;
first = first.next;
if(isEmpty()){
last = null;
}
size--;
return item;
}
/**
* 自定義節點
*/
private class Node{
Item item;
Node next;
}
//下面是省略Iterator的實現
@Override
public Iterator<Item> iterator() {
return new ListIterator();
}
@Override
public void forEach(Consumer<? super Item> action) {
}
@Override
public Spliterator<Item> spliterator() {
return null;
}
private class ListIterator implements Iterator<Item>{
private Node current = first;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
Item item = current.item;
current = current.next;
return item;
}
@Override
public void remove() {
}
@Override
public void forEachRemaining(Consumer<? super Item> action) {
}
}
}
3 總結
此種隊列有以下好處:
(1)所需空間總是和集合大小成正比
(2)操作所需時間總是和集合大小無關