栈和队列的区别

栈和队列是两种常用的数据结构,它们在数据的存取方式、适用场景和基本操作上有显著的区别。以下是它们的详细区别:

1. 存取方式

栈(Stack)

  • 后进先出(LIFO, Last In First Out):最后一个进入栈的元素最先被移出。
  • 典型操作:
    • 压栈(Push):将元素添加到栈顶。
    • 弹栈(Pop):移除并返回栈顶的元素。
    • 窥视(Peek or Top):返回栈顶的元素但不移除它。

队列(Queue)

  • 先进先出(FIFO, First In First Out):最先进入队列的元素最先被移出。
  • 典型操作:
    • 入队(Enqueue):将元素添加到队列的末尾。
    • 出队(Dequeue):移除并返回队列的头部元素。
    • 窥视(Peek or Front):返回队列的头部元素但不移除它。

2. 操作示例

栈操作示例

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("Top element: " + stack.peek()); // 输出: Top element: 3// 弹栈System.out.println("Popped element: " + stack.pop()); // 输出: Popped element: 3System.out.println("Popped element: " + stack.pop()); // 输出: Popped element: 2// 栈是否为空System.out.println("Is stack empty? " + stack.isEmpty()); // 输出: Is stack empty? false}
}

队列操作示例

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();// 入队queue.add(1);queue.add(2);queue.add(3);// 窥视队列头部元素System.out.println("Front element: " + queue.peek()); // 输出: Front element: 1// 出队System.out.println("Dequeued element: " + queue.poll()); // 输出: Dequeued element: 1System.out.println("Dequeued element: " + queue.poll()); // 输出: Dequeued element: 2// 队列是否为空System.out.println("Is queue empty? " + queue.isEmpty()); // 输出: Is queue empty? false}
}

3. 适用场景

  • 递归调用:函数调用栈。
  • 表达式求值:用于解析和计算数学表达式。
  • 括号匹配:用于检查括号是否成对匹配。
  • 浏览器历史记录:用户在浏览网页时的前进和后退操作。

队列

  • 任务调度:操作系统的任务调度、打印队列。
  • 广度优先搜索(BFS):图和树的遍历。
  • 消息队列:在生产者-消费者模式中使用队列进行消息传递。
  • 异步任务处理:在后台任务处理和批处理系统中使用。

4. 数据结构的实现

  • 通常使用数组或链表实现。
  • 在 Java 中,可以使用 Stack 类,或者使用 Deque 接口的实现类(如 ArrayDeque)来实现栈。

队列

  • 通常使用链表或循环数组实现。
  • 在 Java 中,可以使用 Queue 接口的实现类(如 LinkedListPriorityQueueArrayDeque)来实现队列。

5. 复杂度分析

  • **压栈(Push)弹栈(Pop)**操作的时间复杂度都是 O(1)。
  • **窥视(Peek)**操作的时间复杂度也是 O(1)。

队列

  • **入队(Enqueue)出队(Dequeue)**操作的时间复杂度都是 O(1)。
  • **窥视(Peek)**操作的时间复杂度也是 O(1)。

总结

  • :后进先出,适合递归、表达式求值和浏览器历史记录等应用场景。
  • 队列:先进先出,适合任务调度、广度优先搜索和消息队列等应用场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:STL简介和容器string用法篇

一、STL简介 STL是C中的标准模板库&#xff08;Standard Template Library&#xff09;的缩写。它是C标准库的一部分&#xff0c;提供了一系列的数据结构和算法模板&#xff0c;包括各种容器、算法、迭代器、仿函数等&#xff0c;用于简化和加速C程序的开发过程。STL的设计理念…

人形机器人建模与控制(二) - 高级运动学和动态建模

L2: Advanced Kinematic and Dynamic Modeling 这里写目录标题 L2: Advanced Kinematic and Dynamic Modeling1. Introduction2. Kinematic Modeling运动学方程速度的雅可比矩阵雅可比矩阵的两种形式分析雅可比矩阵&#xff08;Analytical Jacobian&#xff09;几何雅可比矩阵&…

【波点音乐看广告】

import uiautomator2 as u2 import time from datetime import datetime import xml.etree.ElementTree as ET import re import os 连接设备 d u2.connect() os.system(‘adb shell chmod 775 /data/local/tmp/atx-agent’) os.system(‘adb shell /data/local/tmp/atx-age…

2024年5月系统架构设计师综合知识真题

1.操作系统:先来先服务调度算法 2.操作系统:多道程序设计&#xff0c;利用率 3.操作系统:状态流转错误的&#xff0c;等待态到运行态 4.数据库:2NF 每一个非主属性完全依赖主键 5.数据库:笛卡尔积m*n 6.数据库:不属于事务的特点&#xff0c;并发性 7.数据库:交集表达式:R-(R-S)…

linux设置不记录历史命令

我们知道Linux历史命令是被保存在内存和各用户家目录下.bash_history文件中&#xff0c;当退出或者登录shell时&#xff0c;其会自动保存或读取。 [rootlogstash ~]# cat .bash_history | tail -n 10 man read touch read.sh chmod 755 read.sh clear vi read.sh sh read.sh…

shell脚本开发基础

shell脚本开发基础 什么是linux内置命令&#xff1f;什么是外置命令 内置命令&#xff1a;在系统启动时就加载入内存&#xff0c;常驻内存&#xff0c;执行效率更高&#xff0c;但是占用资源&#xff0c;cd 外置命令&#xff1a;系统需要从硬盘中读取程序文件&#xff0c;再读…

Fortran: fypp预处理工具

Fortran fypp预处理工具 Fypp基于Python的预处理器工具&#xff0c;不限于语言。利用Python语言&#xff0c;可以批量生成源码 示例 M_logger.fpp module M_loggeruse stdlib_loggeruse stdlib_error contains#:for x,y in [(info,log_information),(debug,log_debug),(warn…

第八篇【传奇开心果系列】Python微项目技术点案例示例:以微项目开发为案例,深度解读Dearpygui 编写图形化界面桌面程序的优势

传奇开心果博文系列 系列博文目录Python微项目技术点案例示例系列 博文目录前言一、开发图形化界面桌面程序的优势介绍二、跨平台特性示例代码和解析三、高性能特性示例代码和解析四、简单易用特性示例代码和解析五、扩展性强示例代码和解析六、现代化设计示例代码和解析七、知…

什么是云渗透测试?

推荐阅读&#xff1a; 什么是安全态势&#xff1f; 什么是人肉搜索 什么是恶意软件&#xff1f; 什么是数字取证&#xff1f; 什么是语音网络钓鱼&#xff1f; 什么是网络安全中的社会工程&#xff1f; 什么是网络安全中的威胁情报&#xff1f; 什么是端点检测和响应 (…

linux 阿里云服务器安装ImageMagick和php扩展imagick

操作系统版本 Alibaba Cloud Linux 3.2104 LTS 64位 # 1.安装ImageMagick yum install -y ImageMagick ImageMagick-devel # 没有pecl要先安装pecl 和头文件 sudo yum install php-devel # 2.pecl 安装扩展 pecl install imagick #寻找所有php.ini文件 find / -name php.…

临时存储和永久存储的区别

大家都知道&#xff0c;我们一般在页面传参的时候一般会用到两种方式&#xff01;一种是路径拼接页面传参&#xff0c;还有一种呢&#xff01;就是我们比较常用的存储&#xff0c;通过接口返回过来的数据&#xff0c;我们将它存起来&#xff0c;到其他页面在取出来是很方便的。…

静态随机存储器(SRAM)

目录 介绍 基本的 SRAM 存储单元阵列 1. SRAM 存储单元 2. SRAM 阵列 3. SRAM 阵列的读写操作 4. SRAM 阵列的扩展 5. SRAM 阵列的应用 6. SRAM 阵列的优缺点 基本的 SRAM 逻辑结构 1. 存储单元 2. 存储单元阵列 3. 译码器 4. 读写电路 5. 控制逻辑 6. SRAM 逻辑…

【前端之ES6语法】

前端之ES6语法 1. ES6简介2. ES6新特性3.ES6不支持&#xff0c;使用babel3.1 参考文献 4.let和const命令5. 模版字符串6.函数之默认值、剩余参数7. 函数之扩展运算符、箭头函数8.箭头函数this指向和注意事项9.解构赋值10.对象扩展11.Symbol类型12.Set集合类型13.Map数据类型14.…

保存ssh的资讯,快速访问linux server的sshpass

安装 sudo apt-get install -y openssh-server sudo apt-get install -y sshpass 假设server的user和密码都是hao&#xff0c;然后server的ip是192.168.0.106 在.bashrc里写入 alias sshnano"sshpass -p hao ssh hao192.168.0.106" #第一次要先运行 ssh hao192…

React自定义Componment和State深层次理解-07

本节主要从底层原理上分析下React开发相关的内容和注意事项&#xff0c;本节会围绕使用展开&#xff0c;而非源码讲解。 Componment详解 什么是组件 在 MVVM架构出现之前&#xff0c;组件主要分为两种。 狭义上的组件&#xff0c;又称为 UI 组件&#xff0c;比如 Tabs 组件、…

Java计算日期相差天数的几种方法

Java计算日期相差天数的几种方法 &#x1f5d3;️ Java计算日期相差天数的几种方法摘要引言一、使用java.util.Date和java.util.Calendar&#x1f4c5;1. 使用java.util.Date示例代码 2. 使用java.util.Calendar示例代码 二、使用java.time.LocalDate&#x1f4c6;示例代码 三、…

微信小程序文本框输入显示已经输入的字数

我们遇到这样的需求&#xff0c;就是微信小程序的输入框下面需要显示输入的字数&#xff1a; 我们通常会使用bindinput事件&#xff0c;让显示的字数等于value的长度&#xff0c;看下面的图&#xff1a; 但在实践中&#xff0c;真机测试中&#xff0c;我们会发现以下问题: 这个…

Java Leyden可3倍提高JVM启动和预热时间

Leyden 存储库的目的是对 Java 程序的启动时间、达到峰值性能的时间和占用空间进行原型改进 。 Leyden 原型包含许多优化&#xff0c;将工作从运行时转移到早期阶段&#xff0c;这些阶段称为_训练运行_。在训练运行中&#xff0c;我们根据对应用程序实际行为的观察&#xff0c…

IP编址、进制转换、IP地址分类、变长子网掩码VLSM、无类域间路由CIDR

前言 网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 IP编址 每个网段上都有两…

Java的类路径究竟是什么?

回答 问了chatgpt这个问题&#xff0c;首先类路径的定义是&#xff1a; 是指一组路径&#xff0c;这些路径告诉Java虚拟机&#xff08;JVM&#xff09;和类加载器在哪里可以找到应用程序所需的类和资源文件。说白了就是在运行java程序的时候需要先将java源代码编译成class文件…