孤樱懶契 发表于 2021-6-25 21:14

【Java】数据结构-循环队列

本帖最后由 孤樱懶契 于 2021-10-23 22:36 编辑



# 队列 Queue

> - ## 队列是一种先进先出的数据结果

# 循环队列实现输出截图

!(https://gitee.com/gylq/cloudimages/raw/master/img/image-20210625210003170.png)

# 循环队列实现代码(完整)

Queue.java(队列接口)

```java
public interface Queue<E> {

    int getSize();
    boolean isEmpty();
    void enqueue(E e);
    E dequeue();
    E getFront();
}

```

LoopQueue.java

```java
public class LoopQueue<E> implements Queue<E>{

    private E[] data;
    private int front, tail;
    private int size;

    public LoopQueue(int capacity){
      data =(E[]) new Object;
      front = 0;
      tail = 0 ;
      size = 0 ;
    }

    public LoopQueue(){
      this(10);
    }

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

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

    @Override
    public int getSize(){
      return size;
    }

    @Override
    public void enqueue(E e){

      if((tail + 1) % data.length == front)
            resize(getCapacity() * 2);

      data = e ;
      tail = (tail + 1) % data.length;
      size ++;
    }

    @Override
    public E dequeue(){

      if(isEmpty()){
            throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
      }
      E ret = data;
      data = null;
      front = (front + 1) % data.length;
      size --;
      if(size == getCapacity() / 4 && getCapacity() / 2 != 0)
            resize(getCapacity() / 2);
      return ret;
    }

    @Override
    public E getFront(){
      if(isEmpty())
            throw new IllegalArgumentException("Queue is empty.");
      return data;
    }


    private void resize(int newCapacity){

      E[] newData =(E[]) new Object;
      for(int i = 0 ; i < size ; i ++)
            newData = data[(i + front) % data.length];
      data = newData;
      front = 0;
      tail = size;
    }

    @Override
    public String toString(){
      StringBuilder res = new StringBuilder();
      res.append(String.format("LoopQueue: size = %d, capacity = %d \n", size, getCapacity()));
      res.append("front [");
      for(int i = front ; i != tail; i = (i + 1) % data.length) {
            res.append(data);
            if ((i + 1) % data.length != tail)
                res.append(", ");
      }
      res.append("] tail");
      return res.toString();
    }

    public static void main(String[] args) {

      LoopQueue<Integer> queue = new LoopQueue<>();
      for (int i = 0; i < 10; i++) {
            queue.enqueue(i);
            System.out.println(queue);

            if (i % 3 == 2) {
                queue.dequeue();
                System.out.println(queue);
            }
      }
    }
}

```

Clearloveu 发表于 2021-6-26 10:35

收藏了再说

rushuang 发表于 2021-6-26 12:10

有注释就更好了
页: [1]
查看完整版本: 【Java】数据结构-循环队列