当前位置: 首页 > news >正文

数据结构:栈

文章目录

    • 一,概述
    • 二,添加数据
    • 三,删除数据


一,概述

栈(Stack)是一种特殊的线性表,它只允许在一端进行插入和删除操作,通常被称为“后进先出”(Last In First Out,LIFO)的数据结构。

栈由一系列元素组成,每个元素具有一个唯一的标识符,称为“栈顶”。栈顶是栈中最后一个被插入的元素,也是下一个要被删除的元素。栈中的元素按照后进先出的顺序排列。

栈的主要操作包括:

  1. 入栈(Push):将一个元素插入到栈顶。
  2. 出栈(Pop):删除栈顶元素并返回它。
  3. 查看栈顶(Peek/Top):返回当前栈顶元素但不删除它。
  4. 判断栈是否为空(IsEmpty)。

栈在计算机科学中有广泛的应用,包括:

  1. 函数调用和递归:在函数调用过程中,将参数和局部变量压入栈中,当函数执行完毕时,将它们从栈中弹出。递归函数也可以使用栈来保存中间结果。
  2. 表达式求值:在算术表达式求值过程中,操作数和运算符被压入栈中,然后使用栈中的元素进行计算。
  3. 括号匹配:在程序设计中,使用栈来检查括号是否匹配。
  4. 后进先出数据结构:栈可以用于实现后进先出的数据结构,如浏览器的前进/后退功能、撤销/重做操作等。
  5. 内存管理:操作系统使用栈来管理程序的内存分配和释放。当一个函数被调用时,它的代码和数据被压入栈中;当函数执行完毕时,它们被从栈中弹出并释放内存。

总之,栈是一种非常有用的数据结构,在计算机科学中有广泛的应用。

简介

  • 栈是一种线性数据结构,意味着数据在栈中的排序是按照它们加入的顺序。
  • 栈遵循 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方法删除(弹出)栈顶的元素。最后,打印出执行弹出操作后的栈。

相关文章:

数据结构:栈

文章目录 栈一&#xff0c;概述二&#xff0c;添加数据三&#xff0c;删除数据 栈 一&#xff0c;概述 栈&#xff08;Stack&#xff09;是一种特殊的线性表&#xff0c;它只允许在一端进行插入和删除操作&#xff0c;通常被称为“后进先出”&#xff08;Last In First Out&a…...

每日刷题-6

目录 一、选择题 二、算法题 1.Fibonacci数列 2.合法括号序列判断 一、选择题 1、 解析&#xff1a;内联函数是一种可以提高函数执行效率的方法&#xff0c;它的原理是编译时在函数调用点直接展开函数体的代码&#xff0c;从而避免了函数调用的开销。 但是&#xff0c;内联函…...

systrace使用注意事项

打开systrace文件报错&#xff1a;Unable to select a master clock domain because no path can be found from “SYSTRACE” to “LINUX_FTRACE_GLOBAL”. 使用systrace生成的trace.html文件无法打开&#xff0c;或者报上面的错误&#xff0c;可以选择下面这个方式&#xff1…...

RockyLinux9.2 网卡配置和nmcli、nmtui命令的使用

NetworkManager NetworkManager 是一个标准的Linux网络配置工具套件&#xff0c;支持服务器&#xff0c;也支持桌面环境&#xff0c; 发展到如今&#xff0c;绝大多数流行的发行版都支持它。 这套网络配置工具适用于 Rocky Linux 8 及更高版本。 nmcli是nm的命令行工具、nmt…...

Java线程池ThreadPoolExecutor应用(Spring Boot微服务)

记录&#xff1a;475 场景&#xff1a;在Spring Boot微服务中使用Java线程池ThreadPoolExecutor。实现Runnable接口提交线程任务到线程池。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3。 1.使用注解配置线程池ThreadPoolExecutor (1)说明 ThreadPoolExecutor&#xff0c;…...

QT5|C++|通过信号槽机制实现进度条更新

背景&#xff1a;最近在写一个删除90天数据显示进度的功能&#xff0c;实现思路是&#xff1a;通过信号槽捕获当前进度值实现。 备注&#xff1a;点击start按钮&#xff0c;开始更新进度条&#xff0c;直到100&#xff08;每隔1s进行更新&#xff09;举个栗子&#xff1a; 1、…...

什么是智能推荐?智能推荐的原理是什么?

一、智能推荐的魔力 2020年的愚人节晚间&#xff0c;罗永浩在抖音带货&#xff0c;相信你也被刷屏了吧。3小时的直播过程中&#xff0c;22款产品轮番出场&#xff0c;最终首播支付交易总额突破1.1亿、整场直播观看总人数超过4800万、总销售件数逾91万&#xff0c;粉丝打赏音浪…...

Windows下的Elasticsearch-head安装

Windows下的Elasticsearch-head安装 参考&#xff1a;https://gitcode.net/mirrors/mobz/elasticsearch-head 需要用到 npm 命令&#xff0c;这里可以提前下载安装下Node.js 即可自动安装npm&#xff1b; Node.js 下载安装地址&#xff1a;https://nodejs.org/en/download # 进…...

两台服务器间进行文件传输

目录 方法1&#xff1a;使用SCP 方法2&#xff1a;使用rsync 使用SSH密钥 两台服务器之间进行文件传输通常可以使用SCP&#xff08;Secure Copy Protocol&#xff09;或rsync命令。这两种方法都是在UNIX和Linux系统上常用的工具&#xff0c;用于安全地复制文件和目录。以下是…...

研究生选控制嵌入式还是机器视觉好?

研究生选控制嵌入式还是机器视觉好&#xff1f; 我是嵌入式/硬件方向转的算法&#xff0c;现在是公司的算法负责人&#xff0c;如果再让我选一次&#xff0c;我是不会再选嵌入式方 向&#xff0c;嵌入式如果只做技术是没前途的。 你要是有一定自学能力&#xff0c;能自己在学校…...

SecureCRT SSH与FTP连接中文乱码

1、首先要保证服务端环境变量是UTF-8编码的 LANG”zh_CN.UTF-8″ 2、会话里面配置好字符编码&#xff1a;UTF-8 SSH会话的窗口就可以正常显示中文了&#xff0c;效果如下 3、打开FTP或者SFTP时进行文件传输时&#xff0c;列表窗口里面还是乱码&#xff0c;需要把SecureCRT安…...

OSI七层网络参考模型与数据流通过程

OSI七层网络参考模型 文章目录 OSI七层网络参考模型1. OSI参考模型初步了解2. OSI参考模型理解3. 数据流通的过程 1. OSI参考模型初步了解 OSI&#xff0c;英文为Open System Interconnect&#xff0c;意为开放式系统互连&#xff0c;国际化标准组织(ISO)指定了OSI模型&#x…...

数字孪生行业相关政策梳理--工业领域相关政策(可下载)

自2021年国家“十四五”规划纲要提出“探索建设数字孪生城市”以来&#xff0c;国家发展和改革委员会、工业和信息化部、住房和城乡建设部、水利部、农业农村部等部门纷纷出台政策&#xff0c;大力推动数字孪生在千行百业的落地发展。这些政策不仅为数字孪生的应用提供了广阔的…...

【工具】咸鱼之王辅助小助手来了!

自动答题的视频演示&#xff1a;【工具】咸鱼之王辅助小助手来了!_哔哩哔哩_bilibili 刚开始搞&#xff0c;还没来得及做界面&#xff0c;目前只做了自动答题。 欢迎感兴趣的大佬一起来开发~...

黑马JVM总结(十)

&#xff08;1&#xff09;直接内存_基本使用 下面我们看一下使用了ByteBuffer直接内存&#xff0c;大文件的读写效率是非常的高 Java本身并不具备磁盘读写的能力&#xff0c;它需要调用操作系统的函数&#xff0c;需要从java的方法内部调用本地方法操作系统的方法&#xff0c…...

JPEG、GIF动图可以转换成SVG、Eps格式的矢量图吗?

在进行图片设计的过程中&#xff0c;我们可能需要很多不同格式的图片&#xff0c;例如 JPG、PNG、BMP 和 GIF 位图图像&#xff0c;怎么将这些图片转换成矢量图呢&#xff1f;一款功能强大的应用程序&#xff0c;能够轻松将位图图片转换成矢量图输出。Vector Magic会帮你进行自…...

数据结构与算法的力量:编写更高效的代码

文章目录 为什么数据结构和算法重要&#xff1f;1. 提高性能2. 节省资源3. 解决复杂问题4. 改进代码质量 常见数据结构和算法数据结构1. 数组&#xff08;Array&#xff09;2. 链表&#xff08;Linked List&#xff09;3. 栈&#xff08;Stack&#xff09;4. 队列&#xff08;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请求结构&#xff1a; 结构图1&#xff1a; 实验解析请求报文&#xff1a; 1.在Edge浏览器上输入ip地址端口号文件资源&#xff0c;也就是下图中的120.XX.139.29:8888/A/B/c.html 2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1)&#xff0c;如下 GET …...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...