用数组实现队列/栈

简介: 使用数组实现栈时,可将动态数组尾部作为栈顶,利用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();
}

}

相关文章
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
165 6
|
6月前
|
前端开发 JavaScript Java
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
276 9
|
2月前
|
人工智能 监控 数据挖掘
智能体来了!企业降本增效新引擎,黎跃春谈AI智能体赋能管理创新
智能体正成为企业降本增效新引擎,黎跃春教授提出AI智能体不仅是工具,更是“数字化员工”。通过自动化办公、智能决策协同与多场景应用,助力企业实现管理透明化与运营效率提升。
|
7月前
|
数据采集 5G 定位技术
时统设备有什么用途、时统终端、时间统一设备
时统设备是一种关键的时间同步系统,广泛应用于通信与科研领域。在通信领域,它确保核心网、无线基站及卫星通信的精准时间同步,提升网络稳定性与服务质量;在科研领域,支持粒子对撞、量子实验、化学反应研究及天文观测等,保障数据精确性与协同性。其高精度特性推动科技探索与发展,为现代科技进步提供重要支撑。文章版权归西安同步电子科技有限公司所有,严禁未经授权转载或洗稿。
|
4月前
|
监控 算法 安全
抖音电商API短视频挂接,商品曝光量翻倍!
在抖音电商API支持下,商家可通过短视频挂接商品,实现曝光量翻倍。本文详解操作步骤与优化策略,助您高效提升转化与销量。立即掌握短视频营销新技能!
305 0
|
8月前
|
人工智能 安全 测试技术
通义灵码:AI重构编码范式,开发者如何迎接“人机共生”时代?
本文探讨了以通义灵码为代表的AI编码助手如何推动软件开发从“人驱动工具”向“人机协同创造”演进。文章分析了其技术突破,如意图理解、上下文感知和可解释性,并讨论了开发者价值链条的重构,包括需求抽象、架构设计与代码审查能力的提升。同时,文章展望了行业变革对开发者身份、云生态竞争及技术伦理的影响,强调在AI驱动的“寒武纪大爆发”前夜,唯有持续进化才能适应未来软件工程的“人机共生”文明。
364 16
|
9月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
500 1