数组实现环形链表

wuchangjian2021-10-27 03:04:35编程学习

 没想通怎么满额复用初始化队列空间

package com.kali.structure;

/**
 * 前提:这是一个环形链表
 *      通过取模算法用数组来实现队列并可复用
 *      1.队列为空的条件判断
 *          front == rear
 *      2.队列满的条件判断
 *          (rear+1) % maxSize == front
 *      3.添加元素
 *          rear = (rear+1) % maxSize
 *      4.获取元素
 *          front = (front+1) % maxSize
 *      ********* 3、4步取模原因是为了让指针周期性复用
 *      5.遍历元素
 *          front + offset()
 *          解析:maxSize - front得到之后元素,加上rear中间的叠加区直接取maxSize模可得
 *          offset = (maxSize - front + rear) % maxSize
 *      6.获取头元素
 *          return queue[front]
 *      在算法的设计过程中将一个位置空出来作为约定,所以实际的有效元素会少一个
 *      这个所谓的约定就是一个预留空间,始终在rear的后一个位置
 */
public class RingQueue {
    private int front;
    private int rear;
    private int maxSize;
    private int[] queue;

    public RingQueue(int init){
        this.maxSize = init;
        queue = new int[maxSize];
    }

    public static void main(String[] args) {
        RingQueue queue = new RingQueue(5);
        queue.add(1);
        queue.add(2);
        queue.add(3);
        queue.add(4);
        //queue.get();
        queue.add(5);
        queue.showQueue();
        //System.out.println(queue.head());
    }

    public boolean isFull(){
        /*
            假设rear在队列下半部分,front在上半部分,那么rear+1刚好与位于
            上半的font重合,说明这一个周期内的元素还未使用,判定为"满"
         */
        
        return (rear+1) % maxSize == front;
    }

    public boolean isEmpty(){
        return front == rear;
    }

    public void add(int num){
        if(isFull()){
            System.out.println("队列已满");
        }else{
            queue[rear] = num;
            rear = (rear+1) % maxSize;
        }
    }

    public int get(){
        if(isEmpty()){
            System.out.println("队列为空");
        }
        int value = queue[front];
        front = (front+1) % maxSize;
        return value;
    }

    public void showQueue(){
        for(int i = front;i < front + offset();i++){
            System.out.println(queue[i]);
        }
    }

    public int offset(){
        return (maxSize - front + rear) % maxSize;
    }

    public int head(){
        if(isEmpty()){
            System.out.println("队列为空");
        }
        return queue[front];
    }
}

返回列表

上一篇:初识spacy

下一篇:6.npm

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。