队列/栈基本原理

简介: 本文介绍栈和队列的基本原理。二者均为操作受限的数据结构:队列只允许在队尾入、队头出,符合“先进先出”(FIFO);栈则仅在栈顶进行插入和删除,遵循“先进后出”(FILO)。底层多用数组或链表实现,核心API包括push、pop、peek和size,时间复杂度均为O(1)。

❗前置知识
阅读本文前,你需要先学习:
● 链表(链式存储)基础
● 数组(顺序存储)基础
计算机的两种存储方式,顺序存储(数组)和链式存储(链表)都讲完了,之后的所有数据结构都是基于这两种存储方式之上玩花活。
本文讲解队列和栈的基本原理,后面的文章会讲解如何用代码具体实现。
先说概念吧,其实队列和栈都是「操作受限」的数据结构。说它操作受限,主要是和基本的数组和链表相比,它们提供的 API 是不完整的。
比方说我们前面实现的数组和链表,增删查改的 API 都实现过了,你可以对任意一个索引元素进行增删查改,只要索引不越界,就随便你。
但是对于队列和栈,它们的操作是受限的:队列只能在一端插入元素,另一端删除元素;栈只能在某一端插入和删除元素。
形象地说,队列只允许在队尾插入元素,在队头删除元素,栈只允许在栈顶插入元素,从栈顶删除元素:
队列就像排队买票,先来的先买,后来的后买;栈就像一摞盘子,最先放的压在最下面,最后放的留在最上面,拿的时候也是最上面的先被拿走。所以我们常说,队列是一种「先进先出 FIFO」的数据结构,栈是一种「先进后出 FILO」的数据结构,就是这个道理。
当然,这个图中把栈竖着画,队列横着画,只是为了更形象,但实际上它们底层都是数组和链表实现的,后面会讲到。这两种数据结构的基本 API 如下:
// 队列的基本 API
class MyQueue {
// 向队尾插入元素,时间复杂度 O(1)
void push(E e);

// 从队头删除元素,时间复杂度 O(1)
E pop();

// 查看队头元素,时间复杂度 O(1)
E peek();

// 返回队列中的元素个数,时间复杂度 O(1)
int size();

}

// 栈的基本 API
class MyStack {
// 向栈顶插入元素,时间复杂度 O(1)
void push(E e);

// 从栈顶删除元素,时间复杂度 O(1)
E pop();

// 查看栈顶元素,时间复杂度 O(1)
E peek();

// 返回栈中的元素个数,时间复杂度 O(1)
int size();

}
不同编程语言中,队列和栈提供的方法名称可能不一样,但每个方法的效果肯定是一样的。

相关文章
|
10月前
|
安全 数据安全/隐私保护 C++
HTTPS ECDHE 握手全解析
HTTPS ECDHE握手详解:基于椭圆曲线的临时密钥交换,实现前向保密与高效安全。解析TLS 1.2下客户端与服务器如何通过6步完成密钥协商,对比RSA握手机制,揭示ECDHE为何成为现代网站标配。
911 1
|
11月前
|
存储 人工智能 前端开发
基于若依框架+AI的养老项目
中州养老系统是专为养老院打造的一体化管理软件,覆盖来访、入住、服务、财务等全流程。分管理后台与家属端,实现机构高效运营与家属便捷互动。技术上采用Vue3+Element Plus前端,若依+SpringBoot后端,MySQL+Redis存储,集成阿里云IOT、OSS及AI工具,助力智慧养老。
|
存储 算法 Java
JVM 内存区域划分与垃圾回收机制详解
本文深入解析JVM内存区域划分与垃圾回收机制,涵盖程序计数器、虚拟机栈、堆、方法区等核心结构,详解对象生命周期、分代收集、GC算法及主流收集器(如G1、ZGC、Shenandoah),并提供调优实践建议,助力开发者掌握Java性能优化核心技能。
444 1
|
人工智能 数据可视化 API
自动查文献+写代码+跑数据+出报告!港大开源 Auto Deep Research 搞定科研全流程
Auto-Deep-Research 是一款由香港大学开源的个人 AI 助理,基于模块化多 Agent 架构,专注于深度研究任务,兼容多种大语言模型,并提供一键启动和文件解析等强大功能。
1894 4
自动查文献+写代码+跑数据+出报告!港大开源 Auto Deep Research 搞定科研全流程
|
SQL 分布式计算 Hadoop
Hadoop生态系统:从小白到老司机的入门指南
Hadoop生态系统:从小白到老司机的入门指南
858 13
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
1358 1
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
开发者
2024 乘风者计划全新启航!快来加入吧!
 2021年,阿里云开发者社区焕新升级,重磅推出“乘风者计划”!诚邀四海技术博主入驻社区,泼墨云间,书写天地。入驻社区,即可享丰厚权益! 新的一年,乘风者计划重磅升级!
252684 81
|
监控 Java Linux
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
JVM内存问题之如果堆内存一直缓慢上涨,如何解决
2021 1
|
网络协议 大数据 网络架构
桥接模式和NET模式的区别
桥接模式和NET模式的区别
1311 0
|
Java API
Java与Lua互相调用简单教程
【8月更文挑战第29天】在软件开发中,Java以其强大的稳定性和广泛的生态系统著称,而Lua则因其轻量级、灵活和嵌入式的特点在脚本编写、游戏开发等领域大放异彩。将两者结合使用,可以充分利用Java的底层能力和Lua的快速开发优势。本文将通过一个简单的教程,介绍如何在Java程序中嵌入并执行Lua脚本,以及如何在Lua中调用Java方法。
1131 0