Java对队列的基本操作

数据结构之基本数据结构---队列:先入先出

百度百科:

  队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,

队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

1.自定义队列实现:

代码展示:

package queue;

import java.lang.reflect.Array;

/**
 * @Author YangHe
 * @Date 2020/4/14 16:45
 * 手动实现:对列的基本操作
 *  先进先出:FIFO
 */
public class QueueTest<T> {
    private int queueSize; //队列大小
    private int base; //基地址
    private int front; //队列头
    private int rear; //队列尾
    private T[] array; //存储使用数组来实现

    /**
     * 初始化队列
     * @param type 数组类型
     * @param queueSize 数组大小
     */
    public QueueTest(Class<T> type,int queueSize){
        this.queueSize=queueSize;
        this.front=this.rear=0;
        this.base=0;
        array= (T[])Array.newInstance(type,queueSize);
    }
    //队列是否为空
    public boolean isEmpty(){
        return front==rear;
    }
    //队列是否已满
    public boolean isFull(){
        return (rear+2)%queueSize==front;  //为区分为空或者满 设置容量-1 为满
    }
    //入队列
    public void offer(T n){
        if(!isFull()){
            if(rear==(queueSize-1)){
                array[rear]=n;
                rear=base;  //重新指向底部
            }else{
                array[rear++]=n;
            }
        }else{
            System.out.println("队列已满!");
        }
    }
    //出队列不删除
    public T peek(){
        if(!isEmpty()){
            return array[front];
        }else{
            return null;
        }
    }
    //出队列删除元素
    public T poll(){
        if(!isEmpty()){
            if(front==(queueSize-1)){
                T t= array[front];
                front=base;
                return t;
            }else{
                return array[front++];
            }
        }else{
            return null;
        }
    }
    //获取队列长度
    public int getQueueLength(){
        return Math.abs(rear-front);
    }
    public static void main(String[] args) {
        QueueTest<Integer> queueTest=new QueueTest<>(Integer.class,5);
        for(int i=0;i<10;i++){
            System.out.println(i+"+++++");
            queueTest.offer(i);
            System.out.println("队列尾:"+queueTest.rear);
            System.out.println("队列头:"+queueTest.front);
            System.out.println("队列长度:"+queueTest.getQueueLength());
            queueTest.poll();
            System.out.println("队列尾:"+queueTest.rear);
            System.out.println("队列头:"+queueTest.front);
            System.out.println("队列长度:"+queueTest.getQueueLength());
        }
    }

}
View Code

结果输出:

 

 

2.通过collection接口下的Queue实现单端队列 该示例代码只是展示部分功能,其他功能自行探索:

示例代码:

package queue;

import java.util.PriorityQueue;

/**
 * @Author YangHe
 * @Date 2020/4/17 0:05
 *  通过collection接口下的Queue实现单端队列
 *  该示例代码只是展示部分功能,其他功能自行探索
 */
public class PriorityQueueTest {
    public static void main(String[] args) {
        PriorityQueue pq=new PriorityQueue();
        pq.add("Java基础"); //添加队列元素
        pq.add("python基础");
        pq.add("MySQL基础");
        pq.add("Linux基础");
        System.out.println("输出队列长度:"+pq.size());
        System.out.println("输出队列"+pq);
        System.out.println("取出不删除队列元素:"+pq.peek()+"  输出队列长度:"+pq.size());
        System.out.println("取出不删除队列元素:"+pq.peek()+"  输出队列长度:"+pq.size());
        System.out.println("取出不删除队列元素:"+pq.peek()+"  输出队列长度:"+pq.size());
        System.out.println("输出队列"+pq);
        System.out.println("取出并且删除队列元素:"+pq.poll()+"  输出队列长度:"+pq.size());
        System.out.println("取出并且删除队列元素:"+pq.poll()+"  输出队列长度:"+pq.size());
        System.out.println("取出并且删除队列元素:"+pq.poll()+"  输出队列长度:"+pq.size());
        System.out.println("输出队列"+pq);
    }
}
View Code

示例结果:

 

 3.实际运用实例:

 

posted @ 2019-12-13 15:59  Cool_Yang  阅读(949)  评论(0编辑  收藏  举报