数据结构---栈(Stack)
1. 简介
栈(Stack)是计算机科学中的一种抽象数据类型,它遵循特定的操作顺序,即后进先出(Last In First Out,LIFO)。这意味着最后添加到栈中的元素将是第一个被移除的。栈的基本操作通常包括:
-
压栈(Push):将一个元素添加到栈的顶部。
-
弹栈(Pop):移除栈顶部的元素,并返回该元素的值。
-
查看栈顶(Peek):返回栈顶部的元素,但不将其从栈中移除。
-
检查栈空(IsEmpty):检查栈是否为空,通常用于在执行操作前确保栈中至少有一个元素。
-
获取栈大小(Size):返回栈中元素的数量。
栈可以用数组或链表来实现。数组实现的栈具有固定的大小,而链表实现的栈可以动态调整大小。

2. 实例
2.1 基于数组实现
public class StackUsingArray {private int[] stack;private int top;private int capacity;public StackUsingArray(int capacity) {this.capacity = capacity;stack = new int[capacity];top = -1;}// Push element onto the stackpublic void push(int item) {if (top == capacity - 1) {System.out.println("Stack is full!");} else {stack[++top] = item;}}// Pop element from the stackpublic int pop() {if (top == -1) {System.out.println("Stack is empty!");return -1;} else {return stack[top--];}}// Peek the top element of the stackpublic int peek() {if (top == -1) {System.out.println("Stack is empty!");return -1;} else {return stack[top];}}// Check if stack is emptypublic boolean isEmpty() {return top == -1;}// Get the size of the stackpublic int size() {return top + 1;}public static void main(String[] args) {StackUsingArray stack = new StackUsingArray(5);stack.push(10);stack.push(20);stack.push(30);System.out.println("Top element: " + stack.peek()); // Output: 30System.out.println("Popped element: " + stack.pop()); // Output: 30System.out.println("Stack size: " + stack.size()); // Output: 2}
}
-
可以增加扩容机制---》ArrayDeque源码中扩容规则:如果数小则翻倍,否则增加50%。
private void grow(int needed) {// overflow-conscious codefinal int oldCapacity = elements.length;int newCapacity;// Double capacity if small; else grow by 50%int jump = (oldCapacity < 64) ? (oldCapacity + 2) : (oldCapacity >> 1);if (jump < needed|| (newCapacity = (oldCapacity + jump)) - MAX_ARRAY_SIZE > 0)newCapacity = newCapacity(needed, jump);final Object[] es = elements = Arrays.copyOf(elements, newCapacity);// Exceptionally, here tail == head needs to be disambiguatedif (tail < head || (tail == head && es[head] != null)) {// wrap around; slide first leg forward to end of arrayint newSpace = newCapacity - oldCapacity;System.arraycopy(es, head,es, head + newSpace,oldCapacity - head);for (int i = head, to = (head += newSpace); i < to; i++)es[i] = null;}
}
2.2 基于链表实现
public class StackUsingLinkedList {private Node top;private class Node {int data;Node next;Node(int data) {this.data = data;this.next = null;}}// Push element onto the stackpublic void push(int item) {Node newNode = new Node(item);newNode.next = top;top = newNode;}// Pop element from the stackpublic int pop() {if (top == null) {System.out.println("Stack is empty!");return -1;} else {int poppedData = top.data;top = top.next;return poppedData;}}// Peek the top element of the stackpublic int peek() {if (top == null) {System.out.println("Stack is empty!");return -1;} else {return top.data;}}// Check if stack is emptypublic boolean isEmpty() {return top == null;}// Get the size of the stackpublic int size() {int size = 0;Node current = top;while (current != null) {size++;current = current.next;}return size;}public static void main(String[] args) {StackUsingLinkedList stack = new StackUsingLinkedList();stack.push(10);stack.push(20);stack.push(30);System.out.println("Top element: " + stack.peek()); // Output: 30System.out.println("Popped element: " + stack.pop()); // Output: 30System.out.println("Stack size: " + stack.size()); // Output: 2}
}
2.3 基于Deque实现类实现
Java中的Deque接口提供了一个双端队列实现,可以非常方便地用来实现栈。
import java.util.Deque;
import java.util.LinkedList;public class StackUsingDeque {private Deque<Integer> stack;public StackUsingDeque() {stack = new LinkedList<>();}// Push element onto the stackpublic void push(int item) {stack.push(item);}// Pop element from the stackpublic int pop() {if (stack.isEmpty()) {System.out.println("Stack is empty!");return -1;} else {return stack.pop();}}// Peek the top element of the stackpublic int peek() {if (stack.isEmpty()) {System.out.println("Stack is empty!");return -1;} else {return stack.peek();}}// Check if stack is emptypublic boolean isEmpty() {return stack.isEmpty();}// Get the size of the stackpublic int size() {return stack.size();}public static void main(String[] args) {StackUsingDeque stack = new StackUsingDeque();stack.push(10);stack.push(20);stack.push(30);System.out.println("Top element: " + stack.peek()); // Output: 30System.out.println("Popped element: " + stack.pop()); // Output: 30System.out.println("Stack size: " + stack.size()); // Output: 2}
}
2.4 总结
-
数组实现:适用于栈大小已知且不频繁改变大小的情况。
push和pop操作的时间复杂度为O(1),但如果栈满时,扩展数组会带来一定的性能开销。 -
链表实现:适用于栈大小不固定的情况。链表实现的栈无需考虑容量问题,但每次操作时需要额外的内存空间来存储节点指针。
-
Deque实现:这是最推荐的实现方式,因为它提供了高效的push和pop操作,并且实现简洁。
Deque接口可以通过LinkedList或ArrayDeque来实现。如果追求性能,ArrayDeque通常是更好的选择,因为它的底层是基于数组的,避免了链表的节点分配开销。
相关笔试题:基于栈(stack)的部分笔试题
不积跬步,无以至千里 --- xiaokai
相关文章:
数据结构---栈(Stack)
1. 简介 栈(Stack)是计算机科学中的一种抽象数据类型,它遵循特定的操作顺序,即后进先出(Last In First Out,LIFO)。这意味着最后添加到栈中的元素将是第一个被移除的。栈的基本操作通常包括&am…...
【全网最新】若依管理系统基于SpringBoot的前后端分离版本开发环境配置
目录 提前准备: 下载源代码 设置依赖 设置后台连接信息 运行后台 运行前端 安装npm依赖 启动前端 登录网页客户端 提前准备: 1、安装mysql 5以上就可以。 2、安装redis. 3、安装npm npm下载地址:https://nodejs.org/dist/v22.12…...
limit(0,10)和limit(10,10)有什么区别吗?
在SQL查询中,LIMIT子句用于限制查询结果的数量。LIMIT子句通常有两种形式: LIMIT offset, countLIMIT count 这里的offset表示从哪一条记录开始选取,count表示选取多少条记录。 LIMIT(0,10):这种形式的LIMIT子句表示从第一条记录…...
grpc与rpcx的区别
什么是微服务?rpc架构的主要区别rpcx与grpc的区别rpcx:grpc:为什么grpc要使用http2,为什么不适应http1或者http3?为什么grpc要使用proto而不是json或者其他数据格式? 为什么rpcx快,快多少?rpcx的具体性能指标与grpc比较: 什么是微服务? 整体功能通过多个程序实现,每个程序…...
基于XML的AOP开发
AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程。 AOP相关术语: 目标对象(Target): 你要去代理的对象,可以理解为之前很单纯的那个对象。 代理对象(Proxy): 你把你那个单纯的对象给我,…...
pdf也算是矢量图——pdf大小调整--福昕pdf
有时候需要把pdf作为矢量图放到latex论文中,有时候需要裁剪掉空白的部分,就需要用福昕pdf进行编辑, 参考文章:福昕高级PDF编辑器裁切工具怎么用?裁切工具使用方法介绍_福昕PDF软件工具集 (foxitsoftware.cn)...
Web应用程序文件包含-Server2233-解析
B-6 Web应用程序文件包含 任务环境说明:服务器场景名称:Server2233...
AI开发: 知识图谱的初识,学会制作知识图谱- Python 机器学习
一、知识图谱的概念 知识图谱是一个通过图结构来表示和组织知识的工具,它将事物、概念和它们之间的关系以图的形式呈现出来,图中的节点代表实体(比如人物、地点、事件等),而边代表这些实体之间的各种关系(…...
Ubuntu Linux用户与组的管理
Ubuntu Linux操作系统- 第一弹 由猪猪侠开启Linux操作系统的学习 文章目录 前言Linux操作系统的发展Linux版本 Linux用户账户及其类型超级用户系统用户普通用户 Ubuntu超级用户权限与管理员Linux的超级用户权限解决方案Ubuntu管理员sudo命令su命令Ubuntu启用root登录 组账户及其…...
算力100问☞第32问:密集计算的关键技术有哪些?
1、高性能处理器和图形处理器 高性能处理器和图形处理器作为计算系统中的核心组件,发挥着至关重要的作用。 高性能处理器是密集计算的基础。它们采用先进的制程技术和架构设计,能够提供更高的时钟频率和更多的核心数量,从而实现更快的计算速…...
Rust : 生成日历管理markdown文件的小工具
需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…...
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
基于单片机的智能农田灌溉节水系统设计及应用
摘 要 : 针对传统的灌溉方法浪费水资源节水系统设计。该系统从节水角度出发,对传感器和主电路进行了设计,主要采集灌溉地的湿度与温度数据,根据测量土壤中的温度与湿度作为主要参数,对农田灌溉节水系统进行实时控制&am…...
jmeter如何导出中文版的测试报告?
文章目录 0、初始步骤:把报告模板换成中文形式1、首先添加一份聚合报告2、然后点开【聚合报告】3,生成报告3.1 选择【工具】-【generate HTML report】3.2 【generate HTML report】参数详解3.3 、最后点击 【generate report】直接生成。 声明ÿ…...
AIGC 与艺术创作:变革与机遇
在当今数字化时代,人工智能生成内容(AIGC)正以惊人的速度重塑着艺术创作的格局,为艺术家们带来了令人振奋的新机遇。 一.AIGC 的崛起与艺术领域的变革 随着人工智能技术的不断进步,AIGC 逐渐在艺术领域崭露头角。它依…...
【Axios】如何在Vue中使用Axios请求拦截器
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
element Plus中 el-table表头宽度自适应,不换行
在工作中,使用el-table表格进行开发后,遇到了小屏幕显示器上显示表头文字会出现换行展示,比较影响美观,因此需要让表头的宽度变为不换行,且由内容自动撑开。 以下是作为工作记录,用于demo演示教程 先贴个…...
【Android】从事件分发开始:原理解析如何解决滑动冲突
【Android】从事件分发开始:原理解析如何解决滑动冲突 文章目录 【Android】从事件分发开始:原理解析如何解决滑动冲突Activity层级结构浅析Activity的setContentView源码浅析AppCompatActivity的setContentView源码 触控三分显纷争,滑动冲突…...
如何使用JDBC向数据库中插入日期数据???
在学习JDBC 的过程中很多小明有疑问在IDEA编辑器是如何插入一个日期类型的数据的,此篇一些方法希望可以帮助到你。 示例: import java.text.ParseException; import java.text.SimpleDateFormat; import java.sql.Date; import java.util.Scanner;publi…...
高频面试题(含笔试高频算法整理)基本总结回顾29
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
游戏脚本助手,电脑点击器,脚本自动点击识图找图_无限试用版
熊猫精灵脚本助手 分类功能项其他功能管理、插件、生成、中控、进程守护、护盾配置、坐标工具脚本设置窗口设置、绑定设置、运行设置、变量设置、程序设置图色识别Yolo识别、找图识别、点色找色文字识别ocr识别找字、字库识别、验证码识别键鼠操作鼠标操作、键盘操作、录制脚本…...
小白友好!YOLO11镜像部署教程:无需独立显卡也能体验目标检测
小白友好!YOLO11镜像部署教程:无需独立显卡也能体验目标检测 1. 引言:为什么选择YOLO11镜像 目标检测是计算机视觉中最基础也最实用的技术之一,而YOLO系列算法以其快速高效著称。最新发布的YOLO11在保持实时性的同时,…...
面试官:包装类型的缓存机制了解么?
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
Qwen3.5-9B多模态应用:上传招聘JD截图生成面试问题+考察点分析
Qwen3.5-9B多模态应用:上传招聘JD截图生成面试问题考察点分析 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的多模态理解能力。该模型特别适合处理需要结合文本和图像信息的任务,比如从招聘JD截图中提取关键信息并生…...
OpenClaw+SecGPT-14B:个人安全实验室自动化搭建全指南
OpenClawSecGPT-14B:个人安全实验室自动化搭建全指南 1. 为什么需要自动化安全实验室 作为一名长期从事安全研究的工程师,我深刻体会到传统手工分析的低效与局限。每次分析新样本时,都需要重复搭建环境、配置工具、收集威胁情报,…...
Qwen3.5-2B企业落地案例:制造业设备图片故障诊断辅助系统搭建
Qwen3.5-2B企业落地案例:制造业设备图片故障诊断辅助系统搭建 1. 项目背景与挑战 在制造业生产线上,设备故障诊断一直是影响生产效率的关键环节。传统方式依赖工程师人工巡检,存在以下痛点: 人力成本高:需要专业工程…...
ai赋能硬件仿真:让快马平台理解你的设计意图,自动生成proteus项目
最近在做一个智能光控系统的硬件仿真项目,发现用AI辅助开发可以大幅提升效率。这里分享一下如何利用InsCode(快马)平台的AI能力,快速生成Proteus仿真项目的过程。 项目需求分析 首先需要明确系统功能:通过光敏电阻检测环境亮度,结…...
基于redis实现限流逻辑
固定窗口计数器 在固定时间窗口内,记录请求次数,如果超过阈值就拒绝,否则放行。 优点:实现简单,性能极高实现方式:incr命令和expire命令缺点:临界突发问题,时间窗口固定,…...
SOONet模型Keil5开发环境模拟:探索嵌入式设备视频事件检测前瞻
SOONet模型Keil5开发环境模拟:探索嵌入式设备视频事件检测前瞻 最近和几个做嵌入式开发的朋友聊天,大家聊到一个挺有意思的话题:现在AI模型越做越强,但好像都跑在云端或者高性能计算卡上。那些我们天天打交道的单片机、微控制器&…...
到底要不要用AI写代码?别争了
其实我一直觉得,现在大家讨论 AI 写代码这件事,有点熟悉。因为以前我们也是这么过来的。刚开始写代码那会儿, 不会就打开 百度, 一行一行找答案,复制、试错、再改。一个分号错了能找半天, 中英文标点混了直…...
