用数组实现队列/栈

简介: 使用数组实现栈时,可将动态数组尾部作为栈顶,利用ArrayList的add和remove方法实现O(1)时间复杂度的入栈、出栈操作。若以头部为栈顶,则需借助环形数组(如CycleArray)实现高效操作。同样,基于环形数组还可轻松实现队列,通过addLast入队、removeFirst出队,满足队列先进先出特性,所有操作均保持O(1)时间复杂度。

用数组实现栈
先用数组实现栈,这个不难,你把动态数组的尾部作为栈顶,然后调用动态数组的 API 就行了。因为数组尾部增删元素的时间复杂度都是 O(1),符合栈的要求。
注意我这里用的是 Java 标准库的 ArrayList,如果你想用之前我们实现的 MyArrayList,也是一样的:
// 用数组作为底层数据结构实现栈
public class MyArrayStack {
private ArrayList list = new ArrayList<>();

// 向栈顶加入元素,时间复杂度 O(1)
public void push(E e) {
    list.add(e);
}

// 从栈顶弹出元素,时间复杂度 O(1)
public E pop() {
    return list.remove(list.size() - 1);
}

// 查看栈顶元素,时间复杂度 O(1)
public E peek() {
    return list.get(list.size() - 1);
}

// 返回栈中的元素个数,时间复杂度 O(1)
public int size() {
    return list.size();
}

}
能否让数组的头部作为栈顶?
按照我们之前实现 MyArrayList 的逻辑,是不行的。因为数组头部增删元素的时间复杂度都是 O(n),不符合要求。但是我们可以改用前文 环形数组技巧 中实现的 CycleArray 类,这个数据结构在头部增删元素的时间复杂度是 O(1),符合栈的要求。
你直接调用 CycleArray 的 addFirst 和 removeFirst 方法实现栈的 API 就行,我这里就不写了。

用数组实现队列
有了前文 环形数组 中实现的 CycleArray 类,用数组作为底层数据结构实现队列就不难了吧。直接复用我们实现的 CycleArray,就可以实现标准队列了。当然,一些编程语言也有内置的环形数组实现,你也可以自行搜索使用:
public class MyArrayQueue {
private CycleArray arr;

public MyArrayQueue() {
    arr = new CycleArray<>();
}

public void push(E t) {
    arr.addLast(t);
}

public E pop() {
    return arr.removeFirst();
}

public E peek() {
    return arr.getFirst();
}

public int size() {
    return arr.size();
}

}

相关文章
|
3月前
|
算法 数据可视化
二叉树的递归/层序遍历 递归遍历(DFS)
本文详解二叉树的遍历框架,涵盖递归遍历的固定访问顺序及前、中、后序的本质区别——即代码在递归函数中的位置不同所致。同时深入讲解层序遍历(BFS)的三种实现方式,适用于不同场景,尤其适合求最短路径问题;而DFS则因结构天然适合搜索所有路径。通过实例对比,阐明BFS与DFS的应用偏好及原理依据。
二叉树的递归/层序遍历 递归遍历(DFS)
|
人工智能 安全 API
这款流行 AI 工具被盗用挖取加密货币,这些隐患你需要知道
Docker 镜像被注入挖矿脚本并不是个别现象,而是一个需要引起重视的安全问题,本文向大家分享下 Higress 防范此类风险的相关经验。
486 91
|
弹性计算 安全 前端开发
阿里云ECS服务器配置Web项目和FTP Server
第一次使用阿里云ECS服务器部署Web项目和FTP Server,在使用过程中遇到了很多困难,但同时对计算机网络的工作原理有了更加清晰的认识。现将使用经历进行系统性地总结。 在阅读之前请确保已购买阿里云ECS云服务器并且初始化云服务器操作系统,本教程选用的操作系统为“Windows Server 2022 数据中心版 64位中文版”。
520 0
|
存储 算法 NoSQL
浅谈软件编程中的8大数据结构
浅谈软件编程中的8大数据结构
515 0
浅谈软件编程中的8大数据结构
|
机器学习/深度学习 传感器 算法
【滤波器设计】FIR滤波器和IIR滤波器的高通、低通、带通滤波器的设计,以及频率响应附Matlab代码和报告
【滤波器设计】FIR滤波器和IIR滤波器的高通、低通、带通滤波器的设计,以及频率响应附Matlab代码和报告
|
Java API Maven
使用Spring-Retry优雅实现异常重试
使用Spring-Retry优雅实现异常重试
|
机器学习/深度学习 开发框架 算法
|
Java Linux Windows
头歌Educoder——Java面向对象 - 文件类(一)
头歌Educoder——Java面向对象 - 文件类
1468 0
头歌Educoder——Java面向对象 - 文件类(一)
|
数据采集 机器学习/深度学习 自然语言处理
【实验】基于朴素贝叶斯的新闻分类
【实验】基于朴素贝叶斯的新闻分类
572 0

热门文章

最新文章