用数组实现队列/栈

简介: 使用数组实现栈时,可将动态数组尾部作为栈顶,利用其O(1)增删特性。也可用环形数组实现头部为栈顶。结合环形数组还可高效实现队列,支持O(1)的入队和出队操作,结构简洁、性能优越。(239字)

用数组实现栈
先用数组实现栈,这个不难,你把动态数组的尾部作为栈顶,然后调用动态数组的 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();
}

}

相关文章
|
存储 数据采集 人工智能
AI时代:云存储加速多模态数据存储与管理创新
阿里云存储产品高级解决方案架构师欧阳雁(乐忱)分享了中国企业在全闪存高端存储市场的快速增长,指出AI大模型的发展推动了企业级存储市场。去年,高端企业级存储闪存占比约为25%,相较于欧美50%的比例,显示出中国在AI领域的巨大增长潜力。演讲涵盖AI业务流程,包括数据预处理、训练和推理的痛点,以及针对这些环节的存储解决方案,强调了稳定、高性能和生命周期管理的重要性。此外,还介绍了数据预处理的全球加速和弹性临时盘技术,训练阶段的高性能存储架构,推理场景的加速器和AI Agent的应用,以及应对大数据业务的存储考量,如对象存储、闪电立方和冷归档存储产品。
44265 22
|
11月前
|
存储 人工智能 前端开发
基于若依框架+AI的养老项目
中州养老系统是专为养老院打造的一体化管理软件,覆盖来访、入住、服务、财务等全流程。分管理后台与家属端,实现机构高效运营与家属便捷互动。技术上采用Vue3+Element Plus前端,若依+SpringBoot后端,MySQL+Redis存储,集成阿里云IOT、OSS及AI工具,助力智慧养老。
|
传感器 JSON 网络协议
MicroPython+ESP32 C3开发上云
本文介绍了基于MicroPython的ESP32 C3开发,涵盖GPIO控制、PWM调光、定时器、DS18B20温度采集、WiFi连接及Socket通信等内容,并详细演示了如何通过WIFI模块连接新大陆云平台,实现设备登录与心跳包维持连接。
952 1
MicroPython+ESP32 C3开发上云
|
Java 数据库连接
解决No enum constant org.apache.ibatis.type.JdbcType.XXX
解决No enum constant org.apache.ibatis.type.JdbcType.XXX
1415 0
|
人工智能 定位技术 数据库
工具设计+动态检索:上下文工程如何让AI智能体像人类一样思考?
本文深入解析AI Agent时代的上下文工程,阐述其从提示工程的演进逻辑,剖析系统提示、工具设计与示例策划三大核心,并探讨长时程任务应对策略,揭示高效信息流管理对构建可靠Agent的关键作用。建议收藏细读。
1022 0
|
机器学习/深度学习 人工智能 编解码
EasyControl Ghibli:在线体验一键生成宫崎骏动画风,开源AI模型让你的照片秒变吉卜力
EasyControl Ghibli是基于扩散模型的AI工具,通过条件注入技术将普通照片转化为吉卜力动画风格,仅需100张训练样本即可精准还原标志性光影与色调特征。
1920 11
EasyControl Ghibli:在线体验一键生成宫崎骏动画风,开源AI模型让你的照片秒变吉卜力
|
人工智能 Cloud Native 虚拟化
小白学网络系列之---从物理网络到云网络
本文由阿里云技术服务部枫桥撰写,围绕物理网络和云网络的基础知识展开,强调网络在云计算中的重要性。文章首先介绍了OSI模型下的物理层、数据链路层、网络层、传输层和应用层,解释了各层的功能与作用。接着探讨了云网络的必要性及其核心技术,如VPC(虚拟私有网络)、Overlay和Underlay网络,并阐述了它们之间的协作关系。最后,文章分析了AI大模型浪潮下云网络的演进方向,包括高速RDMA网络架构、高性能集合通信库ACCL和高性能数据主动加载加速软件KSpeed等技术的应用,展示了云网络在支持大规模分布式AI训练中的关键作用。通过本文,读者可以深入了解从物理网络到云网络的技术演进及其未来发展趋势。
1550 15
|
存储 数据处理 图形学
什么是帧同步技术?
【5月更文挑战第3天】什么是帧同步技术?
1252 9
|
开发者
2024 乘风者计划全新启航!快来加入吧!
 2021年,阿里云开发者社区焕新升级,重磅推出“乘风者计划”!诚邀四海技术博主入驻社区,泼墨云间,书写天地。入驻社区,即可享丰厚权益! 新的一年,乘风者计划重磅升级!
252684 81