简易先进先出队列-自用

Posted eternityculture

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简易先进先出队列-自用相关的知识,希望对你有一定的参考价值。

简易先进先出队列-自用

/**
 * _______________*********_______________________
 * ______________************_____________________
 * ______________*************____________________
 * _____________**__***********___________________
 * ____________***__******_*****__________________
 * ____________***_*******___****_________________
 * ___________***__**********_****________________
 * __________****__***********_****_______________
 * ________*****___***********__*****_____________
 * _______******___***_********___*****___________
 * _______*****___***___********___******_________
 * ______******___***__***********___******_______
 * _____******___****_**************__******______
 * ____*******__*********************_*******_____
 * ____*******__******************************____
 * ___*******__******_*****************_*******___
 * ___*******__******_******_*********___******___
 * ___*******____**__******___******_____******___
 * ___*******________******____*****_____*****____
 * ____******________*****_____*****_____****_____
 * _____*****________****______*****_____***______
 * ______*****______;***________***______*________
 * ________**_______****________****______________
 *
 * @author 闫影 - yanying876@gmail.com
 * @Package user
 * @date 2020/6/1916:53
 */
public class QueueY<T> {

    // 队列最多容纳数量 初始化的时候可以根据自己时间情况设置的相对大一些 总归是空间换时间
    // 考虑 队列慢的情况下可以使用线程让其代替等待
    private int maxSize;   
    private Object[] queueArray;
    // 队头
    private int front;  
    // 队尾
    private int rear;	
    private int size;

    public QueueY(int length) {
        maxSize = length;
        queueArray = new Object[maxSize];
        front = 0;
        rear = -1;
        size = 0;
    }

    /**	入队: 先将rear(队为指针) 加1, 后将数据项存入rear的位置。
     *	当rear 指向maxSize -1 的位置时,将rear 设置为-1(循环队列),加1 后存入数据项。
     */
    public void enQueue(T str){

        // 入队之前先检查队列是否已满,已满则抛出异常。
        if(isFull()){    
            //这里是抛出了一个异常 根据时间使用情况这里可以另做处理 
            throw new RuntimeException("队列已满," + str + " 不能入队!");
        }

        if(rear == maxSize -1){
            rear = -1;
        }
        queueArray[++rear] = str;  // 先将 rear 加1,后取值
        size++;
    }


    /**出队: 先取出front 的值,然后将front 减1
     * 如果 front 超过了数组的顶端,将 front 设置为 0(循环队列)
     */
    @SuppressWarnings("unchecked")
    public T deQueue(){
		// 出队之前先检查队列是否为空。
        // 这里根据实际情况可做另外处理 比如等待 返回特定值
        if(isEmpty()){   
            System.out.printf("队列为空,不能出队!");
            return null;
        }

        T str = (T) queueArray[front++];  // 先去 queueArray[front] 的值,后将front 加1
        if(front == maxSize){
            front = 0;
        }
        size--;
        return str;
    }

    /**查看对头数据项
     */
    @SuppressWarnings("unchecked")
    public T peek(){
        // 查看队头时,判断是否为空, 为空则抛出异常。
        // 此处根据实际情况可以单独处理
        if(isEmpty()){   
            throw new RuntimeException("队列为空!");
        }
        return (T) queueArray[front];
    }

    /** 判断队列是否为空。队空: rear + 1 = front 或 front + maxSize -1 = rear
     *  通过数组容量比队列数据项的最大值大一,来区分对空和对满。
     */
    public boolean isEmpty(){
        return (rear + 1 == front || front + maxSize -1 == rear);
    }

    /**判断队列是否为满。 队满: rear + 2 = front 或 front + maxSize -2 = rear
     * 通过数组容量比队列数据项的最大值大一,来区分对空和对满。
     */
    public boolean isFull(){
        return (rear + 2 == front || front + maxSize -2 == rear);
    }

    /** 获取队列的大小
     */
    public int queueSize(){
	/* 可以通过队头队尾计算出队列的大小,也可以通过一个计数器,当入队是加1,出队是减1.
	 if(rear >= front){
			return rear - front +1;
		}else {
			return maxSize - front + (rear + 1);
		}
	*/
        return size;
    }

//    public static void main(String[] args) {
//        Queue<String> queue = new Queue<>(5);
//        queue.enQueue("a");
//        queue.enQueue("b");
//        queue.enQueue("c");
//        queue.enQueue("d");
//        queue.deQueue();
//        queue.deQueue();
//
//        System.out.println("队列是否为空: " + queue.isEmpty() + "  队列是否满: " + queue.isFull());
//        System.out.println("队列大小:" + queue.queueSize());
//
//        int size = queue.queueSize();
//        for(int i = 0; i < size; i++){
//            String str = queue.deQueue();
//            System.out.print(str + " ");
//        }
//
//    }

以上是关于简易先进先出队列-自用的主要内容,如果未能解决你的问题,请参考以下文章

栈、队列中“先进先出”,“后进先出”的含义

Dictionary实现先进先出代替Queue

VBA - 如何在数组中创建队列? (FIFO)先进先出

队列 先进先出,先进后出,优先级队列

队列排序,先进先出

Java使用LinkedList来模拟一个队列(先进先出的特性)