数据结构:栈
文章目录
- 栈
- 一,概述
- 二,添加数据
- 三,删除数据
栈
一,概述
栈(Stack)是一种特殊的线性表,它只允许在一端进行插入和删除操作,通常被称为“后进先出”(Last In First Out,LIFO)的数据结构。
栈由一系列元素组成,每个元素具有一个唯一的标识符,称为“栈顶”。栈顶是栈中最后一个被插入的元素,也是下一个要被删除的元素。栈中的元素按照后进先出的顺序排列。
栈的主要操作包括:
- 入栈(Push):将一个元素插入到栈顶。
- 出栈(Pop):删除栈顶元素并返回它。
- 查看栈顶(Peek/Top):返回当前栈顶元素但不删除它。
- 判断栈是否为空(IsEmpty)。
栈在计算机科学中有广泛的应用,包括:
- 函数调用和递归:在函数调用过程中,将参数和局部变量压入栈中,当函数执行完毕时,将它们从栈中弹出。递归函数也可以使用栈来保存中间结果。
- 表达式求值:在算术表达式求值过程中,操作数和运算符被压入栈中,然后使用栈中的元素进行计算。
- 括号匹配:在程序设计中,使用栈来检查括号是否匹配。
- 后进先出数据结构:栈可以用于实现后进先出的数据结构,如浏览器的前进/后退功能、撤销/重做操作等。
- 内存管理:操作系统使用栈来管理程序的内存分配和释放。当一个函数被调用时,它的代码和数据被压入栈中;当函数执行完毕时,它们被从栈中弹出并释放内存。
总之,栈是一种非常有用的数据结构,在计算机科学中有广泛的应用。
简介:
- 栈是一种线性数据结构,意味着数据在栈中的排序是按照它们加入的顺序。
- 栈遵循 LIFO(Last In First Out)原则,这意味着最后一个添加到栈中的元素将是第一个被移除的元素。
- 栈只允许在同一端(称为“顶部”)进行添加和删除操作。这一端通常被称为“栈顶”,另一端被称为“栈底”。
- 栈不需要在添加或删除元素时进行任何排序或搜索操作。
图示:
top+-----+ | | | 3 | +-----+ | | | 2 | +-----+ | |
bottom| 1 | +-----+
在这个栈的示例中,元素1、2、3依次被推入栈顶。当元素3被推入时,元素1和2仍然在栈中,但它们现在处于元素3的下方。如果我们要从栈中删除一个元素,元素3将会首先被删除,然后是元素2和1。这就是后进先出(LIFO)的原则。
Java示例:
在Java中,可以使用java.util.Stack类来实现栈。以下是一个简单的示例:
import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1); // 压入元素1stack.push(2); // 压入元素2stack.push(3); // 压入元素3System.out.println("Initial Stack: " + stack); // 打印初始栈System.out.println("Popped element: " + stack.pop()); // 弹出顶部元素并打印System.out.println("Stack after pop operation: " + stack); // 打印执行弹出操作后的栈}
}
在这个示例中,我们首先创建了一个整数类型的栈,然后将元素1、2、3压入栈中。然后我们打印出初始的栈,执行弹出操作并打印出弹出的元素,最后再次打印出执行弹出操作后的栈。
二,添加数据
在Java中,我们可以使用java.util.Stack类来实现栈数据结构。以下是添加数据(压入元素)的示例:
import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();// 添加元素到栈stack.push(1);stack.push(2);stack.push(3);// 打印栈System.out.println("Initial Stack: " + stack);}
}
在这个示例中,我们首先导入了java.util.Stack类。然后,在main方法中,我们创建了一个整数类型的栈实例stack。我们使用push方法向栈中添加元素。最后,我们打印出初始的栈。
请注意,尽管java.util.Stack类是Java早期版本提供的,但现在并不推荐使用它。在多线程环境中,它的性能可能会有问题。在Java的后续版本中,建议使用java.util.Deque接口的实现,如java.util.ArrayDeque,来代替java.util.Stack。以下是使用ArrayDeque实现栈的示例:
import java.util.ArrayDeque;
import java.util.Deque;public class StackExample {public static void main(String[] args) {Deque<Integer> stack = new ArrayDeque<>();// 添加元素到栈stack.push(1);stack.push(2);stack.push(3);// 打印栈System.out.println("Initial Stack: " + stack);}
}
在这个示例中,我们使用了java.util.ArrayDeque类来实现栈。与上面的示例类似,我们使用push方法向栈中添加元素,并打印出初始的栈。
三,删除数据
在Java中,我们可以使用java.util.Stack类来实现栈数据结构。以下是删除数据(弹出元素)的示例:
import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();// 添加元素到栈stack.push(1);stack.push(2);stack.push(3);// 打印初始栈System.out.println("Initial Stack: " + stack);// 删除元素(弹出)System.out.println("Popped element: " + stack.pop());// 打印执行弹出操作后的栈System.out.println("Stack after pop operation: " + stack);}
}
在这个示例中,首先导入了java.util.Stack类。然后,在main方法中,创建了一个整数类型的栈实例stack。使用push方法向栈中添加元素。然后,使用pop方法删除(弹出)栈顶的元素。最后,打印出执行弹出操作后的栈。
请注意,尽管java.util.Stack类是Java早期版本提供的,但现在并不推荐使用它。在多线程环境中,它的性能可能会有问题。在Java的后续版本中,建议使用java.util.Deque接口的实现,如java.util.ArrayDeque,来代替java.util.Stack。以下是使用ArrayDeque实现栈的示例:
import java.util.ArrayDeque;
import java.util.Deque;public class StackExample {public static void main(String[] args) {Deque<Integer> stack = new ArrayDeque<>();// 添加元素到栈stack.push(1);stack.push(2);stack.push(3);// 打印初始栈System.out.println("Initial Stack: " + stack);// 删除元素(弹出)System.out.println("Popped element: " + stack.pop());// 打印执行弹出操作后的栈System.out.println("Stack after pop operation: " + stack);}
}
在这个示例中,使用了java.util.ArrayDeque类来实现栈。与上面的示例类似,使用push方法向栈中添加元素,并使用pop方法删除(弹出)栈顶的元素。最后,打印出执行弹出操作后的栈。
相关文章:
数据结构:栈
文章目录 栈一,概述二,添加数据三,删除数据 栈 一,概述 栈(Stack)是一种特殊的线性表,它只允许在一端进行插入和删除操作,通常被称为“后进先出”(Last In First Out&a…...
每日刷题-6
目录 一、选择题 二、算法题 1.Fibonacci数列 2.合法括号序列判断 一、选择题 1、 解析:内联函数是一种可以提高函数执行效率的方法,它的原理是编译时在函数调用点直接展开函数体的代码,从而避免了函数调用的开销。 但是,内联函…...
systrace使用注意事项
打开systrace文件报错:Unable to select a master clock domain because no path can be found from “SYSTRACE” to “LINUX_FTRACE_GLOBAL”. 使用systrace生成的trace.html文件无法打开,或者报上面的错误,可以选择下面这个方式࿱…...
RockyLinux9.2 网卡配置和nmcli、nmtui命令的使用
NetworkManager NetworkManager 是一个标准的Linux网络配置工具套件,支持服务器,也支持桌面环境, 发展到如今,绝大多数流行的发行版都支持它。 这套网络配置工具适用于 Rocky Linux 8 及更高版本。 nmcli是nm的命令行工具、nmt…...
Java线程池ThreadPoolExecutor应用(Spring Boot微服务)
记录:475 场景:在Spring Boot微服务中使用Java线程池ThreadPoolExecutor。实现Runnable接口提交线程任务到线程池。 版本:JDK 1.8,Spring Boot 2.6.3。 1.使用注解配置线程池ThreadPoolExecutor (1)说明 ThreadPoolExecutor,…...
QT5|C++|通过信号槽机制实现进度条更新
背景:最近在写一个删除90天数据显示进度的功能,实现思路是:通过信号槽捕获当前进度值实现。 备注:点击start按钮,开始更新进度条,直到100(每隔1s进行更新)举个栗子: 1、…...
什么是智能推荐?智能推荐的原理是什么?
一、智能推荐的魔力 2020年的愚人节晚间,罗永浩在抖音带货,相信你也被刷屏了吧。3小时的直播过程中,22款产品轮番出场,最终首播支付交易总额突破1.1亿、整场直播观看总人数超过4800万、总销售件数逾91万,粉丝打赏音浪…...
Windows下的Elasticsearch-head安装
Windows下的Elasticsearch-head安装 参考:https://gitcode.net/mirrors/mobz/elasticsearch-head 需要用到 npm 命令,这里可以提前下载安装下Node.js 即可自动安装npm; Node.js 下载安装地址:https://nodejs.org/en/download # 进…...
两台服务器间进行文件传输
目录 方法1:使用SCP 方法2:使用rsync 使用SSH密钥 两台服务器之间进行文件传输通常可以使用SCP(Secure Copy Protocol)或rsync命令。这两种方法都是在UNIX和Linux系统上常用的工具,用于安全地复制文件和目录。以下是…...
研究生选控制嵌入式还是机器视觉好?
研究生选控制嵌入式还是机器视觉好? 我是嵌入式/硬件方向转的算法,现在是公司的算法负责人,如果再让我选一次,我是不会再选嵌入式方 向,嵌入式如果只做技术是没前途的。 你要是有一定自学能力,能自己在学校…...
SecureCRT SSH与FTP连接中文乱码
1、首先要保证服务端环境变量是UTF-8编码的 LANG”zh_CN.UTF-8″ 2、会话里面配置好字符编码:UTF-8 SSH会话的窗口就可以正常显示中文了,效果如下 3、打开FTP或者SFTP时进行文件传输时,列表窗口里面还是乱码,需要把SecureCRT安…...
OSI七层网络参考模型与数据流通过程
OSI七层网络参考模型 文章目录 OSI七层网络参考模型1. OSI参考模型初步了解2. OSI参考模型理解3. 数据流通的过程 1. OSI参考模型初步了解 OSI,英文为Open System Interconnect,意为开放式系统互连,国际化标准组织(ISO)指定了OSI模型&#x…...
数字孪生行业相关政策梳理--工业领域相关政策(可下载)
自2021年国家“十四五”规划纲要提出“探索建设数字孪生城市”以来,国家发展和改革委员会、工业和信息化部、住房和城乡建设部、水利部、农业农村部等部门纷纷出台政策,大力推动数字孪生在千行百业的落地发展。这些政策不仅为数字孪生的应用提供了广阔的…...
【工具】咸鱼之王辅助小助手来了!
自动答题的视频演示:【工具】咸鱼之王辅助小助手来了!_哔哩哔哩_bilibili 刚开始搞,还没来得及做界面,目前只做了自动答题。 欢迎感兴趣的大佬一起来开发~...
黑马JVM总结(十)
(1)直接内存_基本使用 下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高 Java本身并不具备磁盘读写的能力,它需要调用操作系统的函数,需要从java的方法内部调用本地方法操作系统的方法,…...
JPEG、GIF动图可以转换成SVG、Eps格式的矢量图吗?
在进行图片设计的过程中,我们可能需要很多不同格式的图片,例如 JPG、PNG、BMP 和 GIF 位图图像,怎么将这些图片转换成矢量图呢?一款功能强大的应用程序,能够轻松将位图图片转换成矢量图输出。Vector Magic会帮你进行自…...
数据结构与算法的力量:编写更高效的代码
文章目录 为什么数据结构和算法重要?1. 提高性能2. 节省资源3. 解决复杂问题4. 改进代码质量 常见数据结构和算法数据结构1. 数组(Array)2. 链表(Linked List)3. 栈(Stack)4. 队列(Q…...
Python批量统计pdf中“中文”字符的个数
之前的文章提供了批量识别pdf中英文的方法,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文上。以及自动pdf英文转中文文档,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文下。以及Python统计pdf中英文单词的个数。 本文实现Python统计pdf中中文字符的…...
LeetCode的第 363 场周赛——记录+补题
研究生生涯第一次打力扣周赛——3题 1. 计算 K 置位下标对应元素的和 class Solution { public:int cnt(int x){int sum 0;while (x) {sum ((x%2)?1:0);x/2;}return sum;}int sumIndicesWithKSetBits(vector<int>& nums, int k) {int n nums.size();int ans 0…...
【网络协议】Http-上
Http请求结构: 结构图1: 实验解析请求报文: 1.在Edge浏览器上输入ip地址端口号文件资源,也就是下图中的120.XX.139.29:8888/A/B/c.html 2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1),如下 GET …...
别再用LoadRunner了!用JMeter+阿里云PTS搞定mPaaS网关全链路压测(附MGSJMeterExt插件实战)
从LoadRunner到JMeterPTS:mPaaS网关压测的高效实战指南 在移动应用性能优化的战场上,压力测试一直是确保系统稳定性的关键环节。传统工具如LoadRunner虽然功能强大,但面对mPaaS这类移动网关架构时,其高昂的授权成本、复杂的适配流…...
番茄小说下载器完整指南:如何轻松搭建个人离线图书馆
番茄小说下载器完整指南:如何轻松搭建个人离线图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为网络不稳定无法畅读番茄小说而烦恼吗?番茄小…...
Anaconda 安装与配置 的所有核心步骤
下载:去官网或靠谱的镜像源(如清华镜像)下载 2025.06版 Windows x64 安装包(约950MB)。安装:运行 .exe 文件。关键选项1:勾选 Add Anaconda to my PATH (添加到环境变量)…...
别再只懂PCA了!用Python手写LDA,从鸢尾花分类实战看监督降维的威力
别再只懂PCA了!用Python手写LDA,从鸢尾花分类实战看监督降维的威力 鸢尾花数据集在机器学习领域就像"Hello World"之于编程——经典、简洁却蕴含丰富可能性。当大多数人用PCA处理这类数据时,我们往往忽略了数据本身携带的宝贵标签信…...
FPGA以太网MAC调试架构设计与DSP优化实践
1. 项目概述:FPGA与以太网MAC的DSP调试架构在数字信号处理(DSP)的硬件实现中,调试环节往往成为开发效率的瓶颈。传统JTAG调试方式受限于带宽和灵活性,难以满足大规模数据交互的需求。我们基于Xilinx Virtex-4 FPGA平台…...
dotUI设计系统生成器:基于品牌配置一键生成React组件库
1. 项目概述:dotUI,一个为品牌而生的设计系统在当今的Web开发领域,尤其是基于React的生态中,我们常常面临一个两难的选择:是使用现成的UI组件库快速搭建界面,还是投入大量时间从零开始构建一套完全符合品牌…...
AI系统可观测性:从数据漂移到模型性能的全面监控实践
1. 项目概述:为什么AI系统需要独立的可观测性体系?最近几年,我参与和主导了不下十个所谓的“AI驱动”或“智能”系统的构建与运维。从最初的兴奋到后来的头疼,一个深刻的体会是:传统的监控和日志体系,在AI系…...
开发者技能图谱:如何利用GitHub仓库系统化规划技术学习路径
1. 项目概述:一个面向开发者的技能图谱与学习路径仓库最近在GitHub上闲逛,发现了一个挺有意思的仓库,叫tayyabexe/skills。乍一看名字,你可能会觉得这又是一个“Awesome-XXX”式的资源列表合集。但点进去仔细研究后,我…...
基于LangChain与Ollama构建本地化RAG智能助手:技术栈实践全解析
1. 项目概述:一个本地化AI助手的技术栈实践最近在折腾一个叫“papa-ts”的项目,名字挺有意思,直译过来就是“你的爸爸(TypeScript版)”。当然,这只是一个项目代号,它的核心目标很明确࿱…...
告别网络盲区:用RTL8811CU让旧笔记本变身Linux双频WiFi网卡/AP二合一网关
旧硬件新生:用RTL8811CU打造Linux双频无线网关实战指南 每次升级笔记本后,那些陪伴我们多年的旧设备往往被束之高阁。作为一名网络技术爱好者,我发现这些"退役"笔记本其实蕴藏着巨大的再利用价值——特别是当它们遇到RTL8811CU这样…...
