java栈和队列

目录

1.栈的概念:

2.栈的一些常用的方法:

​编辑 3.栈的模拟实现:

栈的应用:

4.关于栈的练习

5.队列的概念:

6.队列的使用:

7.模拟队列

8.循环队列

9.双端队列:

10.面试题


1.栈的概念:

栈是一种特殊的线性表,其只允许在固定的一端插入和删除操作。进行数据插入和删除的一端叫做栈顶,另一端叫做栈底。数据遵守先入后出的原则。

压栈:数据的插入,数据在栈底。

出栈:数据的删除,数据在栈顶。

2.栈的一些常用的方法:
 public boolean empty() {return size() == 0;}public synchronized boolean isEmpty() {return elementCount == 0;}

这两种方法均可判断栈是否为空

 3.栈的模拟实现:

从图上看出:Stack继承了Vector,ArrayList和Vector类似,都是动态顺序表,但Vector是线程安全的。

public class MyStack {public int[] elem;public int Usedsice; //记录栈的有效数据个数public MyStack() {this.elem = new int[10]; //初始化空间大小}//数据的弹出删除操作public int pop(){if (empty()){  //首先判断是否为空return -1;}Usedsice--;    //栈总是弹出栈尾,就是最后一个元素return this.elem[Usedsice];}//判断是否为空public boolean isFull() {//当栈的长度等于有效数据的个数即满return this.elem.length == Usedsice;}public void push(int index) {if (isFull()) {//TODO 扩容,以二倍大小扩容this.elem = Arrays.copyOf(elem, 2 * elem.length);}this.elem[Usedsice] = index;Usedsice++;}public boolean empty() {return Usedsice == 0;}public int peek(){if(empty()){return -1;}return this.elem[Usedsice-1];}public void print(){if(empty()){return;}for(Integer x:this.elem){System.out.print(x+" ");}System.out.println();}
}
栈的应用:

1.若进栈序列为1,2,3,4,进栈过程中可以出栈,则下列不可能的一个出栈顺序是(C)

A.1,4,3,2                     B.2,3,4,1                  C.3,1,4,2                     D.3,4,2,1

C:3已经进去了,说明1,2也都进去了没有出来,此时出来3,要想接着出来1,必须再把2出栈,所以C错误。

4.关于栈的练习

1.括号匹配:. - 力扣(LeetCode)

2.波兰表达式求值:. - 力扣(LeetCode)

3.出入栈的顺序:栈的压入、弹出序列_牛客题霸_牛客网

4.最小栈:. - 力扣(LeetCode)


5.队列的概念:

只允许在一端进行插入,另一端进行删除的操作的线性表,有先进先出的性质。

队尾:数据插入的一端;

队首:数据删除的一端;

6.队列的使用:

在java中,Queue是个接口,底层是链表实现的。但是队列有链式结构和顺序结构之分。

队列的主要方法:

offer():插入在队尾元素,是返回值boolean类型

poll():在对头删除元素,返回值为删除的数据

peek():获取队头元素

remove():删除队头元素,并返回被删除的元素

7.模拟队列
public class MyQueue {// TODO 队列底层由链表实现,定义一个节点static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val){this.val = val;}}ListNode first; //头尾节点ListNode last;//TODO 队列尾进头出public void offer(int val){ListNode temp = new ListNode(val);if(isEmpty()){first = last = temp;}else{//尾插,再将尾节点置为lastlast.next = temp;temp.prev = last;last = last.next;}}public int poll(){if (isEmpty()){return -1;}else {first = first.next;first.prev = null;}return first.val;}public int peek(){if (isEmpty()){return -1;}else {return first.val;}}public boolean isEmpty() {return first == null;}public void print(){ListNode cur = first;while (cur!=null){System.out.print(cur.val+" ");cur = cur.next;}System.out.println();}
}

8.循环队列

还有一种队列叫做循环队列,通常使用数组实现

如何区分是空,还是满

定义一个head指向下标为0处,当index == arr.length-1则队列已经满,

每次释放元素,使head = (head+1)% arr.length, head == index的时候则队列已经空 

9.双端队列:

两端都可以进队和出队的队列,Deque 是double ended queue” 的简称。可以从队尾进出,也可以从对头进出

Deque是一个接口,必须创建LinkedList的对象

但是在实际工程中,栈和队列都可以使用该接口。

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

1.用栈实现队列:. - 力扣(LeetCode)

2.用队列实现栈:. - 力扣(LeetCode)

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

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

相关文章

【汇编】存储器

存储器 计算机存储器可分为内部存储器&#xff08;又称内存或主存&#xff09;和外部存储器&#xff0c;其中内存是CPU能直接寻址的储存空间&#xff0c;由半导体器件制成 存储单元的地址和内容 计算机存储信息的基本单位是一个二进制位&#xff0c;一位可存储一个二进制数&…

【鸿蒙开发】第二十一章 Media媒体服务(一)

1 简介 Media Kit&#xff08;媒体服务&#xff09;提供了AVPlayer和AVRecorder用于播放、录制音视频。 在Media Kit的开发指导中&#xff0c;将介绍各种涉及音频、视频播放或录制功能场景的开发方式&#xff0c;指导开发者如何使用系统提供的音视频API实现对应功能。比如使用…

funasr 麦克风实时流语音识别

参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…

C# dynamic 数据类型

在C#中&#xff0c;dynamic是一种数据类型&#xff0c;它允许在运行时推迟类型检查和绑定。使用dynamic类型&#xff0c;可以编写更具灵活性的代码&#xff0c;因为它允许在编译时不指定变量的类型&#xff0c;而是在运行时根据实际情况进行解析。 dynamic类型的变量可以存储任…

老板最怕你出这样的代码。。。

大家好&#xff0c; 这一个月时间&#xff0c;阿里巴巴、滴滴、腾讯都发生过应用线上故障的事情&#xff0c;很多同学说是降本增“笑”的后果然后圈内流传一个新想法&#xff0c;为了避免“开源节流” 的事情&#xff0c;工作中要写一些防御性的代码。 什么意思&#xff1f;就…

大模型(Large Models):探索人工智能领域的新边界

&#x1f31f;文章目录 &#x1f31f;大模型的定义与特点&#x1f31f;模型架构&#x1f31f;大模型的训练策略&#x1f31f;大模型的优化方法&#x1f31f;大模型的应用案例 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Models&#xff09;成为了引领深度…

python基础——类【类的定义和使用、魔术方法】

&#x1f4dd;前言&#xff1a; python中的类&#xff0c;自我感觉在某种程度上和C语言的结构体是有共同之处的&#xff0c;如果有兴趣&#xff0c;可以先看看这篇文章&#xff1a;C语言——结构体类型&#xff08;一&#xff09;&#xff0c;先了解一下C语言中的结构体&#x…

SpringBoot之集成Redis

SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 &#xff08;正常都需要自定义序列化&#xff09;五、分布式锁&#xff08;一&#xff09;RedisTemplate 去实现场景一&#xff1a;单体应用场景二&…

第二期书生浦语大模型训练营第三次笔记

RAG RAG是什么&#xff1f; RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺…

springboot数字化智慧城市管理系统源码

目录 ​系统开发环境 系统功能模块 系统特点 1、智慧城管移动端 2、案件受理 3、AI视频智识别分析 系统应用价值 1、提升案件办理效率 2、提升监管效能 3、提升行政执法水平 4、推进行政执法创新 智慧城管综合执法办案系统功能 现场移动执法 一般程序案件的网上办…

2023年度编程语言将花落谁家

2023年度编程语言将花落谁家 TIOBE的预测你预测年度最受欢迎的编程语言会是什么&#xff1f;TIOBE 认为 C# 最有可能成为年度编程语言&#xff0c;你同意吗&#xff1f;为什么&#xff1f;AI时代已经到来&#xff0c;你有学习新语言的打算吗&#xff1f; 以下是来自年度编程语言…

[攻防世界]Reversing-x64Elf-100

1.查壳 无壳&#xff0c;ELF文件 2.用IDA64打开 找到关键部分 这里有坑&#xff0c;看清楚v3是长度为3数组&#xff0c;里面放三个字符串 3.脚本解密 v1"Dufhbmf" v2"pGimos" v3"ewUglpt" v4[v1,v2,v3] a1[0,0,0,0,0,0,0,0,0,0,0,0] for i …