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

简介: 【数据结构与算法 | 基础篇】环形数组模拟队列

1. 前言

上文我们用环形单向链表实现了队列.接下来我们用环形数组来模拟队列.并实现了isFull(),isEmpty()等方法.

2. 环形数组模拟队列

(1). Queue接口 :

public interface Queue<E> {
    //向队伍插入值, 插入成功返回true, 否则返回false
    boolean offer(E value);
    //对队头获取值, 但不移除
    E poll();
    //从队头获取值, 并移除队头
    E peek();
    //判断队伍是否为空
    boolean isEmpty();
    //判断队列是否已满
    boolean isFull();
}

(2). 环形数组模拟队列

public class ArrayQueue<E> implements Queue<E>, Iterable<E>{
    //数组的容量
    private int capacity;
    //环形数组
    private E[] queue;
    //队头
    private int head = 0;
    //队尾
    private int tail = 0;
    public ArrayQueue() {
        capacity = 10;
    }
 
    public ArrayQueue(int capacity) {
        this.capacity = capacity;
        //数组capacity个位置存储数据, 剩下一个位置用来区分队伍是满了还是空了的情况
        queue = (E[]) new Object[capacity + 1];
    }
 
    @Override
    public boolean offer(E value) {
        //如果队伍已经满了, 那么添加元素失败
        if(isFull()) {
        return false;
    }
    queue[tail] = value;
    tail = (tail + 1) % queue.length;
        return true;
}
 
    @Override
    public E poll() {
        //如果队列为空, 那么返回null
        if(isEmpty()) {
            return null;
        }
        return queue[head];
    }
 
    @Override
    public E peek() {
        //如果队列为空, 那么返回null
        E value = queue[head];
        head = (head + 1) % queue.length;
        return value;
    }
 
    @Override
    public boolean isEmpty() {
        return head == tail;
    }
 
    @Override
    public boolean isFull() {
        //数组的长度queue.length并不等于数组的容量capacity
        return (tail+1) % queue.length == head;
    }
 
    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            int p = head;
            @Override
            public boolean hasNext() {
                return p != tail;
            }
 
            @Override
            public E next() {
                E value = queue[p];
                p++;
                return value;
            }
        };
    }
}

3. 单元测试

public class ArrayQueueTest {
    @Test
    public void test() {
        ArrayQueue<Integer> queue = new ArrayQueue<>(5);
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        queue.offer(5);
//        for (Integer element : queue) {
//            System.out.print(element);
//        }
        //12345
        System.out.println(queue.poll());
        //1
        System.out.println(queue.peek());
        //1
        System.out.println(queue.poll());
        //2
    }
}
相关文章
|
16天前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
22 5
【数据结构】优先级队列(堆)从实现到应用详解
|
7天前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
3天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
|
3天前
|
测试技术
02_由两个栈组成的队列
02_由两个栈组成的队列
|
7天前
|
存储
|
24天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
147 3
|
25天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
26 0
【数据结构】栈和队列的深度探索,从实现到应用详解
|
2月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
2月前
|
机器学习/深度学习 消息中间件 缓存
栈与队列的实现
栈与队列的实现
40 0
|
2月前
|
测试技术
【初阶数据结构篇】队列的实现(赋源码)
首先队列和栈一样,不能进行遍历和随机访问,必须将队头出数据才能访问下一个,这样遍历求个数是不规范的。
下一篇
无影云桌面