java数据结构-------栈和队列

news/2024/4/27 5:24:37/文章来源:https://blog.csdn.net/weixin_64634186/article/details/127215647

文章目录

  • 1、栈(Stack)
    • 1、什么是栈
    • 2、栈中常使用的方法
    • 3、栈的应用场景
      • 1、逆序打印链表
      • 2、有效的括号
  • 2、队列(Queue)
    • 1、什么是队列
    • 2、队列的使用
    • 3、循环队列

目标:1、 栈的概念及使用,2、 队列的概念及使用,3.、相关OJ题

1、栈(Stack)

1、什么是栈

栈:
1、一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。

2、进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
3、栈中的数据元素遵守先进后出的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。

进栈:
在这里插入图片描述
出栈
在这里插入图片描述

2、栈中常使用的方法

在这里插入图片描述

public class Test {public static void main(String[] args) {Stack stack = new Stack<>();//构造一个空栈//push()方法是往栈中存放元素stack.push(1);//向栈中压入元素,底层可以理解为是以数组的形式存储的stack.push(2);stack.push(3);System.out.println(stack);}
}

运行结果:
在这里插入图片描述

//pop()方法是将栈顶元素弹出,并返回栈顶元素//所谓栈顶元素就是最后入栈的元素stack.pop();System.out.println(stack);

运行结果:
在这里插入图片描述

        //peek()方法是获取栈顶元素,并不弹出System.out.println(stack.peek());

运行结果:
在这里插入图片描述

      stack.push(1);//向栈中压入元素,底层可以理解为是以数组的形式存储的stack.push(2);stack.push(3);stack.push(4);stack.push(5);System.out.println(stack);//获取栈中有效元素的个数int ret = stack.size();System.out.println(ret);

运行结果:
在这里插入图片描述

        //判断栈是否为空,栈为空返回true,栈中有元素返回falseBoolean flag = stack.isEmpty();System.out.println(flag);

运行结果:
在这里插入图片描述

3、栈的应用场景

1、逆序打印链表

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;public class Test1 {Stack stack = new Stack<>();//构造一个空栈class ListNode{public int val;ListNode next;public ListNode(int val) {this.val = val;}}ListNode head;public ListNode creatNode(){ListNode listNode1 = new ListNode(1);ListNode listNode2 = new ListNode(2);ListNode listNode3 = new ListNode(3);ListNode listNode4 = new ListNode(4);ListNode listNode5 = new ListNode(5);head = listNode1;//创建一个头结点listNode1.next = listNode2;listNode2.next = listNode3;listNode3.next = listNode4;listNode4.next = listNode5;listNode5.next = null;return listNode1;}public void print(ListNode Node){ListNode cur = Node;//将原始链表的头结点保存,防止丢失//打印原始链表while (Node != null){System.out.print(Node.val+" ");Node = Node.next;}System.out.println();//将链表中的元素存入栈中while (cur != null){stack.push(cur.val);//元素入栈cur = cur.next;}//在链表不为空的情况下,将栈中元素出栈并打印//重点:栈中的元素是先入后出while(!stack.isEmpty()){System.out.print(stack.pop()+" ");}}public static void main(String[] args) {Test1 test1 = new Test1();test1.creatNode();//创建一个链表test1.print(test1.head);//逆序打印一个链表}}

运行结果:
在这里插入图片描述

2、有效的括号

力扣第20题:添加链接描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

其次,我们要想到利用栈相关的知识去解决问题
解题思路:

创建一个栈,并将所有的左括号压入栈中,一旦遇到右括号,从栈中弹出一个元素与之比较,相同则继续比较下一个,否则返回false;因为栈是先进后出的特性,所以弹出的那个元素就是与右括号相邻的左括号。

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack();//创建一个栈for(int i=0;i<s.length();i++){//遍历整个字符串,并获取每一个元素char x  = s.charAt(i);//元素是左括号,则存入栈中if(x == '('||x == '['||x == '{'){stack.push(x);}else{if(stack.empty()){return false;}char ch2 = stack.peek();//先判断栈中最顶部的元素是否与之匹配if((x==')'&&ch2=='(')||(x=='}'&&ch2=='{')||(x==']'&&ch2=='[')){//如果匹配,则弹出该元素stack.pop();}else{//否则返回falsereturn false;}}}//当字符串遍历完成之后,如果栈不为空,则意味着左括号多了,此时也返回falseif(!stack.empty()){return false;}//当字符串遍历完成之后,如果栈为空,此时也返回true;return true;}
}

2、队列(Queue)

1、什么是队列

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

队的插入删除操作是在队的两端进行的,这一点需要和栈进行区别

在这里插入图片描述

2、队列的使用

在Java中,Queue(队列)是个接口,底层是通过链表实现的。

在这里插入图片描述

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;public class Test {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<Integer>();//因为Queue只是一个接口,所以我们要创建一个LinkedList,并进行向下转型//offer()往队列中放入元素queue.offer(1);queue.offer(2);queue.offer(3);queue.offer(4);System.out.println(queue);//因为Queue底层是链表实现的,所以我们直接打印即可}
}

运行结果:
在这里插入图片描述

          //poll()将队头的元素删除queue.poll();System.out.println(queue);

运行结果:
在这里插入图片描述
peek()、isEmpty()、size()使用方法与Stack相同,故不再做过多讲解。

3、循环队列

实际中我们有时还会使用一种队列叫循环队列

循环队列通常使用数组实现。
在这里插入图片描述

创建一个循环队列:
题目地址:
添加链接描述

//MyCircularQueue(k): 构造器,设置队列长度为 k 。
//Front: 从队首获取元素。如果队列为空,返回 -1 。
//Rear: 获取队尾元素。如果队列为空,返回 -1 。
//enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
//deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
//isEmpty(): 检查循环队列是否为空。
//isFull(): 检查循环队列是否已满。class MyCircularQueue {public int[] elem;public int front;//队头public int rear;//队尾//构造器,设置队列长度为 kpublic MyCircularQueue(int k) {//创建一个k+1长度的数组,防止溢出elem = new int[k+1];}// enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。public boolean enQueue(int value) {if(isFull()){//数组已满的情况下,直接返回falsereturn false;}elem[rear] = value;rear = (rear+1)%elem.length;return true;}//    deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。public boolean deQueue() {if(isEmpty()){return false;}front = (front+1)%elem.length;return true;}//    Front: 从队首获取元素。如果队列为空,返回 -1 。public int Front() {if(isEmpty()){return -1;}else{return elem[front];}}public int Rear() {if(isEmpty()){return -1;}else{int index = rear == 0 ? elem.length-1 : rear-1;return elem[index];}}//    isEmpty(): 检查循环队列是否为空。public boolean isEmpty() {if(front == rear){return true;}return false;}//    isFull(): 检查循环队列是否已满。public boolean isFull() {if((rear+1)%elem.length == front){return true;}return false;}
}

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

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

相关文章

FISCO BCOS(十五)——— Windows下的go环境配置及beego环境配置并解决bee run报错问题

1、下载地址 https://golang.google.cn/dl/2、双击打开下载的文件&#xff0c;一路按照默认点击下一步&#xff0c;&#xff08;安装位置可选&#xff0c;默认安装在c盘&#xff09; 3、go环境配置&#xff08;很重要的&#xff09; 在系统变量名中新建变量名&#xff1a;GOP…

Java如何生成花里胡哨的二维码

目录一、序言二、找资料1、寻觅文档2、寻觅代码三、代码示例1、简单的二维码2、带颜色的二维码3、带logo的二维码四、工具类封装一、序言 之前在做头马演讲俱乐部哼哈官可视化汇报报告时&#xff0c;为了方便大家移动端查看可视化报告&#xff0c;而不是通过点击链接这种生硬的…

Android 面试java知识小结

1.-1的二进制是多少&#xff0c;怎么算出来的&#xff1f; 1111 1111 在计算机里是以补码的形式存在的&#xff0c;那为什么要使用补码呢&#xff1f; 计算机中的有符号数有三种表示方法&#xff0c;即原码、反码和补码。三种表示方法均有符号位和数值位两部分&#xff0c;符号…

如何使用界面控件DevExpress WinForms自带的UI模板?其实很简单

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

科研工具总结

科研工具总结 1、论文检索网站2、自己收集数据集----并构建数据集2.1数据集来演方式:3种3、怎么进行一个算法的调研?泛读论文:精读论文:1、论文检索网站 Connected papers:一个基于知识图谱的论文检索网站 特点:圆圈的半径越大表示论文越经典,引用数量比较多; 论文的新…

python与人工智能:KNN近邻法识别手写数字

机器学习分类&#xff1f; 1 特征&#xff08;feature&#xff09; 数据是区分事物和事物的关键。 举例&#xff1a;不同类型的书&#xff0c;我们用书的内容来对它进行分类 2 标签&#xff08;label&#xff09; 数据的标签&#xff0c;显示的分类结果。 举例&#xff1a;书属…

每日面试题2道、算法两道

目录 一、 面试题 i、i的自增问题 写一个Singleton实例 二、数组 算法 寻找数组的中心索引 搜索插入位置 一、 面试题 i、i的自增问题 /*** packageName: com.sofwin.mianshi* user: wentao* date: 2022/10/10 14:31* email 1660420659qq.com* description: i、i的 面…

(附源码)计算机毕业设计SSM志愿者活动管理平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

pytorch:本地使用tensorboard可视化

摘要&#xff1a; tensorboard是tensorflow用来可视化训练和测试过程的模块&#xff0c;而pytorch并没有可视化模块&#xff0c;但是pytoch1.2.0版本以上开始支持tensorboard。 目录一、 安装tensorboard二、 使用tensorboard1、首先导入模块&#xff1a;2、初始化&#xff1a;…

深度神经网络怎么用

深度学习 对硬件的要求 之前热衷于学习理论知识&#xff0c;目前想跑代码了发现不知道从何下手&#xff0c;自己电脑上搭建的平台基本就是个摆设&#xff0c;因为跑不起来呀。今天我们就来看看想做深度学习应该怎么下手。 首先了解下基础知识&#xff1a;1、深度学习用cpu训练…

2.Jenkins项目创建

Jenkins项目创建1.新建项目 2.创建一个freestyle的项目 3.填写描述信息 4.可以选择丢弃旧的构建 每次构建都会产生一个任务&#xff0c;这个任务想保留多少天&#xff0c;可以设置保留构建的天数 保留最大的个数&#xff1a;例如设置为10个&#xff0c;当任务达到了10个之…

Spring Rest Docs使用

今天给大家分享一个能通过代码自动生成文档技术&#xff0c;Spring Rest Doc过在单元测试中额外添加 API 信息描述&#xff0c;从而自动生成对应的文档片段。 下面通过一个简单的例子演示下如何快速上手的。在Spring Boot项目中添加maven 依赖 <dependency><groupId&g…

Android 使用Jenkins 自动化多渠道打包并且分发到蒲公英、下发到钉钉通知【即拿即用】

前言 一、tomcat 安装启动 二、jenkins war 包下载并安装 三、jenkins 配置教程 四、jenkins items 工程配置 五、android gradle 脚本编码 六、分发到蒲公英脚本编码以及七、通知钉钉逻辑编码 前言 Android 在每个版本测试阶段&#xff0c;通常会因为修复BUG 去验证&#x…

理解vue中的.sync和.$emit

首先来说一下 .sync 修饰符的作用 第一步&#xff1a;先用一句话解释 .sync修饰符可以实现子组件与父组件的双向绑定&#xff0c;并且可以实现子组件同步修改父组件的值。 第二步&#xff1a;具体解释 一般情况下&#xff0c;想要实现父子组件间值的传递&#xff0c;通常使用…

英文论文要怎么查重?

英文论文查重和中文查重一样&#xff0c;只是在渠道选择方面会有些许差别。今天就具体聊聊英文论文怎么查重&#xff0c;并向大家推荐几个比较常用的英文论文查重工具。 英文论文怎么查重&#xff1a; 1、论文为什么要查重 2、论文查重的原理 3、英文论文怎么查重 4、选择…

柳州楼顶种植水稻 国稻种芯·中国水稻节:广西12万亩米飘香

柳州楼顶种植水稻 国稻种芯中国水稻节&#xff1a;广西12万亩米飘香 广西新闻网-南国今报柳江讯&#xff08;记者钟华 通讯员梁睿&#xff09;新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农…

RabbitMQ常用消息模式

目录 1、RabitMQ工作队列 2、交换机 3、RabbitMQ Fanout 发布订阅--- Fanout exchange(扇型交换机) 3.1、创建连接代码 3.1、生产者代码 3.2、消费者代码 4、Direct路由模式 4.1、生产者代码 4.2、消费者代码 5、Topic主题模式 5.1、生产者代码 5.2、消费者代码 1、…

分享两套企业级进销存管理系统源码

▶▶▶▶1&#xff1a;SpringBoot企业级进销存ERP管理系统源码 00189 本系统采用企业级开发标准&#xff0c;使用SpringBoot架构&#xff0c;数据访问层采用Spring Data Jpa&#xff0c;业务控制层采用SpringMvc&#xff0c;安全框架采用Shiro&#xff0c;实现了完整权限系…

风控模型别只会KS、AUC了,来看看其他衡量模型好坏的一些重要指标吧|含实操

当我们训练好一个机器学习模型之后&#xff0c;必然会对模型的综合性能进行评估&#xff0c;针对分类、回归、聚类等不同类型的算法模型&#xff0c;可以采用相关的评价指标&#xff0c;例如分类模型的Accuracy、KS等&#xff1b;回归模型的MAE、MSE等&#xff1b;聚类模型的SS…

Linux下编写C使用的GDB调试器

目录 1.GDB调试器 2.GDB使用 3.实例程序调试 &#xff08;1&#xff09;编写一段C程序 &#xff08;2&#xff09;对C程序进行编译 &#xff08;3&#xff09;调试阶段 ①启动调试 ②查看文件 ③设置断点 ④查看断点情况 ⑤运行代码 ⑥单步运行 ⑦恢复程序 ⑧查看…