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

栈和队列-Java

目录

一、栈

     1.1 概念

     1.2 栈的使用

     1.3 栈的模拟实现 

     1.4 栈的应用场景

    1.5 概念区分

二、队列

    2.1 概念

    2.2 队列的使用

    2.3 队列的模拟实现

    2.4 循环队列

三、双端队列

四、面试题


一、栈

     1.1 概念

        栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的元素遵循先进后出的原则。

        压栈:栈的插入操作,也叫进栈或入栈,在栈顶插入数据出栈:栈的删除操作,在栈顶删除数据

        

     1.2 栈的使用

方法解释
Stack()构造一个空的栈
E push(E e)将 e 入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空
public static void main(String[] args) {Stack<Integer> stack = new Stack();stack.push(1);stack.push(2);stack.push(3);stack.push(4);stack.push(5);System.out.println(stack.size());//5//获取栈顶元素System.out.println(stack.peek());//5System.out.println(stack);  //[1, 2, 3, 4, 5]stack.pop();//出栈  5System.out.println(stack.size());//4System.out.println(stack);  //[1, 2, 3, 4]System.out.println(stack.empty());//false
}

     1.3 栈的模拟实现 

        由图可知Stack继承了VectorVectorArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。

public class MyStack {int[] elem;int usedSize;public MyStack(){elem = new int[3];}//判断栈是否满了private boolean CapacityIsFull(){return  usedSize == elem.length;}//确保容量充足private  void  ensureCapacity(){if(CapacityIsFull()){elem = Arrays.copyOf(elem,elem.length*2);}}//入栈public int push(int data){ensureCapacity();elem[usedSize++] = data;return  data;}//获取栈顶元素public int peek(){if(usedSize == 0){throw new StackNullEception("栈为空,无法获取栈顶元素");}return  elem[usedSize-1];}//出栈public int pop (){int e = peek();usedSize--;return  e;}//获取栈的长度public  int size(){return  usedSize;}//判断栈是否为空public boolean empty(){return  usedSize == 0;}
}

     1.4 栈的应用场景

        1. 改变元素的序列

1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
        A: 1,4,3,2      B: 2,3,4,1      C: 3,1,4,2      D: 3,4,2,1
2. 一个栈的初始状态为空。现将元素 1 2 3 4 5 A B C D E 依次入栈,然后再依次出栈,则元素出栈的顺
序是( )。
A: 12345ABCDE      B: EDCBA54321      C: ABCDE12345      D: 54321EDCBA
        2. 将递归转化为循环
//递归方式
void printList(Node head){if(head == null){return;}printList(head.next);System.out.println(head.val+" ");
}
//循环方式
void printList2(Node head){if(head == null){return;}Stack<LinkList.Node> stack = new Stack<>();//将链表中的元素(节点)放入栈中Node cur = head;while(cur !=null){stack.push(cur);cur = cur.next;}//栈中的元素出栈while (!stack.empty()){System.out.print(stack.pop().val+" ");}
}

     3. 括号匹配

     4. 逆波兰表达式求值

     5. 出栈入栈次序匹配

     6. 最小栈

    1.5 概念区分

        栈、虚拟机栈、栈帧有何区别?

        栈是一种数据结构,虚拟机栈是JVM划分的一块内存,栈帧是方法调用时,虚拟机给方法分配的一块内存。

二、队列

    2.1 概念

        队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点入队列:进行插入操作的一端称为队尾(Tail/Rear出队列:进行删除操作的一端称为队头

    2.2 队列的使用

        Queue是个接口,底层是通过链表实现。

        

        

方法解释
boolean offer(E e)入队列
E poll()出队列并返回
E peek()获取队头元素
int size()获取队列中有效长度的个数
boolean isEmpty判断队列是否为空

        Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();//入队queue.offer(1);queue.offer(2);queue.offer(3);System.out.println(queue);//[1, 2, 3]//获取队头元素int t = queue.peek();System.out.println(t);//1//出队System.out.println(queue.poll());//1System.out.println(queue);//[2, 3]//判断队列是否为空boolean bool = queue.isEmpty();System.out.println(bool);//false
}

     2.3 队列的模拟实现

        队列中可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到
常见的空间类型有两种:顺序结构 和 链式结构,那么 队列的实现使用顺序结构还是链式结构好?
/*双向链式队列*/
public class MyLinkqueue {static  class  ListNode{int val;ListNode next;ListNode pre;public ListNode(int val){this.val = val;}}ListNode first;//队头ListNode last;//队尾int usedsize;//队列中元素个数//入队列public boolean offer(int data){ListNode node = new ListNode(data);if(first == null){//空队列first = node;last = node;}else {last.next = node;node.pre = last;last = last.next;}usedsize++;return  true;}//获取队头元素public int peek(){if(usedsize == 0){return -1;}return first.val;}//出队列public int poll(){int x = peek();//只有一个元素if(first.next==null){first = null;last = null;}first = first.next;first.pre = null;usedsize--;return  x;}//获取队列中元素的个数public int size(){return usedsize;}//判断队列是否为空public boolean isEmpty(){return usedsize == 0;}
}

     2.4 循环队列

        实际中我们有时会使用一种队列叫循环队列,环形队列通常使用数组实现。
        
设计循环队列

三、双端队列

        双端队列(deque)指允许两端都可以进行入队和出队操作的队列说明元素可以从队头入队和出队,也可以从队尾入队和出队。

        Deque是一个接口,使用时必须创建LinkedList的对象。

        

        实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。

Deque<Integer> stack = new ArrayDeque<>();// 双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

四、面试题

        1、用队列实现栈    链接

        2、 用栈实现队列    链接

相关文章:

栈和队列-Java

目录 一、栈 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1.5 概念区分 二、队列 2.1 概念 2.2 队列的使用 2.3 队列的模拟实现 2.4 循环队列 三、双端队列 四、面试题 一、栈 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端进行插…...

ORA-07445: exception encountered: core dump [kdxlin()+4088]---惜分飞

abort方式关闭数据库&#xff0c;启动报错 Tue Sep 19 21:52:56 2023 NOTE: dependency between database orcl and diskgroup resource ora.DATA.dg is established Tue Sep 19 21:52:57 2023 Reconfiguration started (old inc 4, new inc 6) List of instances: 1 (myinst:…...

【C刷题】day3

一、选择题 1、已知函数的原型是&#xff1a; int fun(char b[10], int *a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 【答案…...

go 线程限制数量 --chatGPT

问&#xff1a;runTask(names, limit), 遍历启动以names的子名称的工作线程 name测试打印&#xff0c;上限数量是limit, 要求打印所有names gpt: 你可以使用 Go 协程来实现 runTask 函数&#xff0c;该函数会遍历启动以 names 子名称的工作线程&#xff0c;并在达到上限数量 …...

【Linux网络编程】日志与守护进程

日志是网络服务器程序在后台以守护进程的形式运行时&#xff0c;处理情况的描述被打印到了日志文件里面&#xff0c;方便维护人员查看。 1.前台进程与后台进程 左边会话输入命令 sleep 10000 & 代表进程后台运行&#xff0c;右边会话输入命令 sleep 20000可以看到命令行解…...

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出 目录 多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出&#xf…...

Qt: 鼠标形状设置

设置全局鼠标形状 设置完毕后&#xff0c;整个APP的任何窗体&#xff0c;包括Dialog中的鼠标形状都会被修改为设定类型&#xff0c;某一个控件设定的鼠标形状将被替换。一般不建议使用 QCursor cursor;//创建鼠标对象 cursor.setShape(Qt::CursorShape::ClosedHandCursor);//…...

【Oracle】Oracle系列之七--表的创建与管理

文章目录 往期回顾前言1. 表的创建2. 表的修改3. 表中数据的增删改查&#xff08;1&#xff09;插入数据&#xff08;2&#xff09;删除数据&#xff08;3&#xff09;更新数据 4. 表的Merge5. 表的删除6. 表的重命名7. 表的索引&#xff08;1&#xff09;B树索引&#xff08;2…...

C/C++运算符超详细讲解(系统性学习day5)

目录 前言 一、运算符的概念与分类 二、算术运算符 三、关系运算符 四、逻辑运算符 五、赋值运算符 六、运算符的优先级 总结 前言 本篇文章是对运算符的具体讲解。 一、运算符的概念与分类 概念&#xff1a; 运算符就是一种告诉编译器执行特定的数学或逻辑操作的符…...

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…...

建筑能源管理(1)——建筑能源管理的概念

1、什么是建筑能源管理 目前&#xff0c;主要有三种不同的类型能源管理&#xff1a; (1)节约型能源管理 又称“减少能耗型”能源管理。这种管理方式着眼于能耗数量上的减少&#xff0c;采取限制用能的措施。例如&#xff0c;在非人流高峰时段停开部分电梯、在室外气温特别高时…...

SpringSecurity

明文存储密码&#xff0c;前加{noop}...

C++ vector模拟实现

目录 一.默认成员函数 二.扩容相关函数 三.[]重载 四.修改函数 五.迭代器 继上次写完string之后&#xff0c;可以写一个vector练练手以及熟悉其底层。vector是一个顺序表&#xff0c;相比普通数组不同点在于顺序表的数据必须是连续存放的。 一.默认成员函数 string是只存放字符…...

BUUCTF:[GYCTF2020]FlaskApp

Flask的网站&#xff0c;这里的功能是Base64编码解码&#xff0c;并输出 并且是存在SSTI的 /hint 提示PIN码 既然提示PIN&#xff0c;那应该是开启了Debug模式的&#xff0c;解密栏那里随便输入点什么报错看看&#xff0c;直接报错了&#xff0c;并且该Flask开启了Debug模式&am…...

好玩的调度技术

好玩的调度技术 文章目录 好玩的调度技术前言一、乱金柝-空间剥离二、拖拽编辑三、全端兼容 前言 最近感觉自己抑郁了&#xff0c;生态技术实在太庞大太复杂&#xff0c;所以我决定先停一段时间&#xff0c;在停下写生态的这两天写了几个调度的小玩意换换脑子&#xff0c;很有…...

Android 自定义加解密播放音视频(m3u8独立加密)

文章目录 背景加密流程音视频解密音视频播放结语 背景 当涉及App内部视频的时候&#xff0c;我们不希望被别人以抓包的形式来爬取我们的视频大视频文件以文件方式整个加密的话需要完全下载后才能进行解密当前m3u8格式虽然支持加密&#xff0c;但是ts格式的小视频可以独立播放的…...

常见的文件格式

一、C:\fakepath\新建文本文档.txt [object String] 实现方式&#xff1a; <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…...

浏览器输入url后回车展开过程

当你在浏览器中输入一个URL并敲下回车后&#xff0c;浏览器会执行一系列步骤来访问并展示网页。下面是浏览器访问网页的一般流程&#xff1a; DNS解析&#xff1a;浏览器首先会提取URL中的主机名&#xff0c;然后向DNS服务器发送请求&#xff0c;将主机名解析为对应的IP地址。这…...

Docker 容器创建命令说明

使用命令如下: docker run -itd --name=cluster -v /home/ClusterApp/cluster:/home/ClusterApp/cluster --restart=always --privileged=true -p 12000:12000 python:3.8 命令说明: docker run 创建一个容器并运行 docker run --help 可以查看所有的参数: 命令中参数说明 -…...

西瓜书读书笔记整理(六)—— 第六章 支持向量机

第六章 支持向量机 6.1 间隔与支持向量6.1.1 什么是支持向量机6.1.2 支持向量与间隔6.1.3 支持向量机的求解过程 6.2 对偶问题&#xff08;dual problem&#xff09;6.2.1 什么是对偶问题6.2.2 如何求解支持向量机的对偶问题 6.3 核函数&#xff08;kernel function&#xff09…...

uni-app小程序开发必备:纯TypeScript实现4种UUID生成方案(无npm依赖)

uni-app小程序开发实战&#xff1a;零依赖TypeScript实现4种UUID生成方案 在uni-app跨平台开发中&#xff0c;小程序环境对npm库的支持限制常常让开发者头疼。特别是在需要生成唯一标识符的场景下&#xff0c;传统依赖uuid库的方案往往无法直接使用。本文将带你从底层原理出发&…...

终极LxgwWenKai字体配置指南:如何为VSCode和IDEA打造完美中文编程体验

终极LxgwWenKai字体配置指南&#xff1a;如何为VSCode和IDEA打造完美中文编程体验 【免费下载链接】LxgwWenKai LxgwWenKai: 这是一个开源的中文字体项目&#xff0c;提供了多种版本的字体文件&#xff0c;适用于不同的使用场景&#xff0c;包括屏幕阅读、轻便版、GB规范字形和…...

XML Notepad:Windows平台XML文档编辑与转换的完整解决方案

XML Notepad&#xff1a;Windows平台XML文档编辑与转换的完整解决方案 【免费下载链接】XmlNotepad XML Notepad provides a simple intuitive User Interface for browsing and editing XML documents. 项目地址: https://gitcode.com/gh_mirrors/xm/XmlNotepad XML No…...

3步实现Windows系统极致优化:Win11Debloat专业指南

3步实现Windows系统极致优化&#xff1a;Win11Debloat专业指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和改善…...

ArduPilot电机控制逻辑与PWM输出机制剖析

1. ArduPilot电机控制基础概念 当你第一次接触无人机飞控时&#xff0c;最让人困惑的莫过于电机控制逻辑了。想象一下&#xff0c;你手里拿着遥控器&#xff0c;轻轻推动摇杆&#xff0c;无人机就能平稳地上升、下降或者转向。这背后到底发生了什么&#xff1f;让我用最直白的…...

无人机控制中的模糊控制:一维与二维模糊控制及其实现要点

无人机 控制方面 模糊控制 有一维模糊和二维模糊两种&#xff0c;文字说明资料已遗失&#xff0c;数学模型可以根据仿真图推导&#xff0c;直接运维simulink会报错&#xff0c;是因为没有导入模糊规则&#xff0c;在运行simulink之前需要在命令窗口输入workreadfis work.fis ,这…...

信息安全毕设容易的项目选题汇总

0 选题推荐 - 网络与信息安全篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满…...

RK3576/RK3588 Yolo11 目标检测 Demo

前言 以前的大作业&#xff0c;根据rknn_model_zoo和easy eai示例代码修改&#xff08;缝合&#xff09;&#xff0c;仅供参考 后来我试着模块化一些&#xff0c;方便看&#xff0c;但因为核心代码都是直接用的示例代码&#xff0c;所以有些模块还是耦合&#xff08;composit…...

文明降级运动:回归纸笔抵抗AI监控

在AI技术席卷软件测试领域的浪潮中&#xff0c;一个看似“倒退”却极具战略意义的趋势正在兴起——文明降级运动。这场运动的核心是主动回归纸笔工具&#xff0c;以抵抗AI监控带来的系统性风险。作为软件测试从业者&#xff0c;我们身处技术前沿&#xff0c;见证了AI在缺陷预测…...

UE5 UI控件实战指南 —— 从基础到高级交互设计

1. UE5 UI控件基础入门 第一次打开UE5的UMG编辑器时&#xff0c;看到琳琅满目的控件面板可能会有点懵。别担心&#xff0c;我们先从最基础的Image和Text控件开始&#xff0c;就像学画画先从线条练起一样。 Image控件相当于你的画布。我习惯先在内容浏览器里右键创建"用户界…...