数据结构10:单链队列的简单实现


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;
 
 
    }
}



猜你喜欢

转载自blog.csdn.net/qq_38788128/article/details/80943470
今日推荐