《征服数据结构》队列和循环队列

摘要:

1,队列的介绍

2,队列的数组实现

3,队列的链表实现

4,循环队列的介绍

1,队列的介绍

队列(queue)是一种先进先出(FIFO, First-In-First-Out)的数据结构,就像大家排队买票一样,先来的先买。队列只允许在后端(rear)插入,在前端(front)删除。

98a03ab010b372d97289933ab5ff9f99.png

队列是一种非常简单的数据结构,在考试和面试中遇到的也比较多,队列的实现方式一般有两种方式,一种是通过数组实现,一种是通过链表实现。

2,队列的数组实现

使用数组实现队列需要先声明一个数组,然后使用两个变量rear和front分别指向队列的尾部和头部,rear实际指向的是尾部元素的下一个位置。

因为数组的长度在初始化的时候就已经确定,当队列中元素的个数等于数组长度的时候就不能再添加了,这个时候也可以考虑扩容,原理比较简单,我们直接看下代码。

0b10d18c34262e9bba9b939f52486d48.png

Java 代码:

public class Queue<E> {
    private final Object[] data; // 队列中存放元素的数组。
    private final int maxSize;// 队列的最大容量,超过最大容量可以考虑扩容。
    private int size; // 队列中元素的个数
    private int front = 0;// 队列的头,只能删除,指向队列的第一个元素
    private int rear = 0; // 队列的尾,只能添加,指向队列最后一个元素的下一个位置

    public Queue(int maxSize) {
        if (maxSize <= 0)
            throw new IllegalArgumentException("队列容量必须大于0 : " + maxSize);
        this.maxSize = maxSize;
        data = new Object[this.maxSize];
    }

    // 这地方可以扩容也可以抛异常,这里我们就不在扩容了,关于扩容,大家可以自己去实现
    public void add(E val) {
        if (isFull())
            throw new IllegalStateException("队列已经满了,无法再加入……");
        data[rear++] = val;// 添加元素。
        size++;
    }

    // 删除元素
    public E poll() {
        if (isEmpty())
            throw new IllegalStateException("队列是空的,无法删除……");
        E res = (E) data[front];
        data[front++] = null;
        size--;
        return res;
    }

    // 获取队列头部元素
    public E top() {
        if (isEmpty())
            throw new IllegalStateException("队列为空");
        return (E) data[front];
    }

    public boolean isEmpty() {// 队列是否为空
        return size == 0;
    }

    public boolean isFull() {// 队列是否满
        return rear == maxSize;
    }

    public int size() {// 队列中元素的个数
        return size;
    }
}

C++代码:

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值