【数据结构】环形队列

环形队列

1. 定义

环形队列就是将队列在逻辑上看作环形结构、物理上仍是数组形式存储的一种数据结构。

其实现主要分为两种情况:

  1. 浪费空间法
  2. 记录空间法

2. 实现

实现要考虑的是成员变量

2.1 记录空间法

使用used标识当前存储了多少元素,如果为空,那么就将head移到0位置处,如果满了,那么就将tail移到0位置处
在这里插入图片描述

1. 入队

队列是从队尾入,队头出,所以就是在tail的位置入队,每入一个元素就将tail++,当满的时候就将tail恢复到队头。

普通情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

队列满了:在这里插入图片描述

这时就需要tail=0,等待某个时候有元素出队,这个时候新插入的元素就又能在tail的位置进行插入。在这里插入图片描述


出队操作与入队操作对称,同理。

2. 代码实现
package MyCircleQueue;

public class CircleQueue {
   
    int size = 5;// 队列最大容量
    int used = 0;// 队列已使用元素
    int[] data = new int[size];// 存储队列数据
    int tail = 0, head = 0;// 队列头尾指针
    public void offer(int val) {
   
        // 满了
        if (used == size) {
   
            tail = 0;
            System.out.println("满了");
            return;
        }
        // 没满
        data[tail++] = val;
        used++;
        System.out.println("存入"+val);
    }

    public int poll() {
   
        if (used == 0) {
   
            head = 0;
            System.out.println("空了");
            return -1;
        }
        int ret = data[head++];
        used--;
        System.out.println("取出:"+ret);

        return ret;
    }
}

2.2 浪费空间法

在这种方式中,我们只使用头尾两个指针进行计算,并将 head = tail 的情况记作空,将 (tail+1)%size = head 的情况记作满

2.2.1实现代码:
package MyCircleQueue;

public class CircleQueue2 {
   
    int size = 5;
    int[] data = new int[size];
    int head= 0, tail = 0;

    public void offer(int val) {
   
        if ((tail+1) % size == head) {
   
            System.out.println("满了");
            return;
        }

        data[tail++] = val;
        System.out.println("入队:"+val);
    }

    public int poll() {
   
        if (head == tail) {
   
            System.out.println("空了");
            return -1;
        }

        int ret = data[head++];
        System.out.println("出队:"+ret);
        return ret;
    }
}

3. 测试代码:

package MyCircleQueue;

public class Test {
   
    public static void main(String[] args) {
   
        CircleQueue queue = new CircleQueue();

        for (int i = 0; i < 10; i++) {
   
            queue.offer(i);
        }

        for (int i = 0; i < 10; i++) {
   
            int ret = queue.poll();
        }
    }
}

4. 结论

环形队列分为两种实现方式:

方法 满的标记 空的标记
浪费空间法 (tail+1)%size == head head == tail
标记长度法 used == size used == 0

其中推荐使用标记长度法。

相关推荐

  1. 数据结构与算法 | 基础篇】环形数组模拟队列

    2023-12-05 17:12:01       14 阅读
  2. 数据结构-队列

    2023-12-05 17:12:01       34 阅读
  3. 数据结构队列

    2023-12-05 17:12:01       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 17:12:01       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 17:12:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 17:12:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 17:12:01       18 阅读

热门阅读

  1. MFC 读写注册表

    2023-12-05 17:12:01       35 阅读
  2. Python实现人工蜂群算法

    2023-12-05 17:12:01       40 阅读
  3. WebSocket

    2023-12-05 17:12:01       42 阅读
  4. 云原生之深入解析Jenkins多分支管道

    2023-12-05 17:12:01       32 阅读
  5. 电脑耳机和音响怎么同时使用

    2023-12-05 17:12:01       43 阅读
  6. 暴力破解攻击与彩虹表攻击

    2023-12-05 17:12:01       36 阅读
  7. 4、单例模式(Singleton Pattern)

    2023-12-05 17:12:01       38 阅读