美文网首页
环形队列-数组简单实现

环形队列-数组简单实现

作者: 与诗小睡 | 来源:发表于2022-04-04 10:19 被阅读0次
package demo;

/**
 * ѭ������
 * 
 * @author Administrator
 *
 */
public class LoopQueue<E> {

    private E[] data;
    private int front, tail;
    private int size;
    private final static int growFactor = 2;
    private final static double compressThreadhold = 0.25;

    public LoopQueue() {
        this(10);
    }

    public LoopQueue(int capacity) {
        if (capacity <= 0)
            throw new IllegalArgumentException("����������0");
        data = (E[]) new Object[capacity + 1];
        front = 0;
        tail = 0;
        size = 0;
    }

    public int getCapacity() {
        return data.length - 1;
    }

    public int getSize() {
        return size;
    }

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

    public boolean isFull() {
        return (tail + 1) % data.length == front;
    }

    public void enQueue(E e) throws IllegalAccessException {
        if (e == null)
            throw new IllegalArgumentException("����������");
        if (isFull())
            resize(data.length * growFactor);
        data[tail] = e;
        tail = (tail + 1) % data.length;
        size++;
    }

    public E deQueue() {
        E result = null;
        if (isEmpty())
            throw new IllegalAccessError("������");
        result = data[front];
        front = (front + 1) % data.length;
        size--;
        if (size < (data.length * compressThreadhold))
            resize(data.length / growFactor);
        return result;
    }

    private void resize(int capacity) {
        E[] ndata = (E[]) new Object[capacity + 1];
        for (int i = 0; i < size; i++) {
            ndata[i] = data[(i + front) % data.length];
        }
        System.out.println("����һ��....");
        data = ndata;
        front = 0;
        tail = size;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("queue [");
        for (int i = front; i != tail; i = (i + 1) % data.length) {
            sb.append(data[i]);
            sb.append(" ,");
        }
        sb.append("] tail");
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        LoopQueue<Integer> lq = new LoopQueue<Integer>();
        for (int i = 0; i < 50; i++) {
            lq.enQueue(i);
        }
        System.out.println(lq);
        System.out.println(lq.getCapacity() + ":" + lq.getSize());
        System.out.println("==================================");
        for (int i = 0; i < 40; i++) {
            lq.deQueue();
        }
        System.out.println(lq);
        System.out.println(lq.getCapacity() + ":" + lq.getSize());
    }

}

相关文章

  • 环形队列-数组简单实现

  • 数据结构

    稀疏数组 代码实现: 队列 代码实现: 环形队列 什么时候队列满:(rear+1)%maxsize == fron...

  • 数组实现环形队列

    利用数组结构在队列的基础下用取模算法来实现环形队列。 环形队列拥有复用功能。 主要算法思想:1)front指向队列...

  • 数据结构之队列

    什么是队列 队列是一个有序列表, 可以用数组或链表实现 先入先出 使用数组模拟队列和环形队列 用数组模拟队列 思路...

  • workQueue有以下七种选择

    : ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列(数组结构可配合指针实现一个环形队列)。...

  • 数组实现环形队列

    我这里实现的是循环队列 front:指向第一个数据的位置rear:指向最后一个数据的下一个位置maxSize:数组...

  • 使用数组实现环形队列

    整体思路解析 上次我们演示了使用数组实现队列的方式,在结尾处提出了一个问题,因为我们使用双指针后移的方式,被弹出队...

  • 数组实现的环形队列

    基本思想: 环形展开成链表,在链表上模拟环形队列; head 和tail只增不减,add 、remove、size...

  • 循环队列

    顺序存储实现循环队列 使用数组模拟环形结构,数组大小为MAXQSIZE front表示队头元素 rear表示队尾元...

  • 队列和栈的底层实现、环形数组、最小栈、栈相关

    01实现一个可以在两端进出的栈、队列 环形数组 最小栈GetMinStack 两个栈实现一个队列 TwoStack...

网友评论

      本文标题:环形队列-数组简单实现

      本文链接:https://www.haomeiwen.com/subject/amhcsrtx.html