数据结构:栈
文章目录
- 栈
- 一,概述
- 二,添加数据
- 三,删除数据
栈
一,概述
栈(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 …...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...
