package myproject.work.Queue_demo;
import com.zejian.structures.LinkedList.singleLinked.Node;
import java.io.Serializable;
import java.util.NoSuchElementException;
/**
* 单链表的队列
* @param <T>
*/
public class LinkedQueue<T> implements Queue<T>,Serializable {
//头结点和尾节点 当head==null&&rear==null是队列为空
private Node<T> head,rear;
private int size;
//最大容量
private int maxSize=128;
public LinkedQueue() {
//初始化队列
this.head=this.rear=null;
}
/**
* 队列中对象的个数
* @return
*/
@Override
public int size() {
return this.size;
}
/**
* 设置最大的数量
*
*/
public void setMaxSize(int maxSize){
this.maxSize=maxSize;
}
/**
* 判空
* @return
*/
@Override
public boolean isEmpty() {
return this.head==null&&this.rear==null;
}
/**
* 入队
* @param data
* @return
*/
@Override
public boolean add(T data) {
Node<T> q = new Node<>(data, null);
//判断
if (isEmpty()){//空队列
this.head= q;
}else{//队列中有值
this.rear.next=q;
}
//更新尾指针
this.rear=q;
size++;
return true;
}
/**
* offer 方法可插入一个元素,这与add 方法不同,
* 该方法只能通过抛出未经检查的异常使添加元素失败。
* 而不是出现异常的情况,例如在容量固定(有界)的队列中
* NullPointerException:data==null时抛出
* IllegalArgumentException:队满,使用该方法可以使Queue的容量固定
* @param data
* @return
*/
@Override
public boolean offer(T data) {
if (data==null)
throw new NullPointerException("The data can\'t be null");
if (size>=maxSize)
throw new IllegalArgumentException("The capacity of LinkedQueue has reached its maxSize:128");
Node<T> q = new Node<>(data, null);
//判断
if (isEmpty()){//空队列
this.head= q;
}else{//队列中有值
this.rear.next=q;
}
//更新尾指针
this.rear=q;
size++;
return true;
}
/**
* 返回队头元素,不执行删除操作,若队列为空,返回null
* @return
*/
@Override
public T peek() {
if (isEmpty()){
return null;
}
return this.head.data;
}
/**
* 返回队头元素,不执行删除操作,若队列为空,抛出异常:NoSuchElementException
* @return
*/
@Override
public T element() {
if(isEmpty()){
throw new NoSuchElementException("The LinkedQueue is empty");
}
return this.head.data;
}
/**
* 删除操作 先进先出
* @return
*/
@Override
public T poll() {
if (isEmpty()){
return null;
}
T data = this.head.data;
//重新赋值
this.head=this.head.next;
if (this.head==null){//最后一个数据
this.rear=null;
}
size--;
return data;
}
@Override
public T remove() {
if (isEmpty()){
throw new RuntimeException("为空");
}
T data = this.head.data;
//重新赋值
this.head=this.head.next;
if (this.head==null){//最后一个数据
this.rear=null;
}
size--;
return data;
}
@Override
public void clearQueue() {
this.head=this.rear=null;
this.size=0;
}
}