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

栈与队列-Java【力扣】【算法学习day.7】

前言

我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!

共勉!!!


一.什么是栈和队列

1.队列

简单来说就是一种先进先出的线性数据结构,如下图:


2.栈

简单来说就是一种先进后出的线性数据结构,如下图:


二.在习题中掌握基本使用【力扣】

ps:下面1,2两题虽然要求使用栈和队列,这边我利用数组来实现栈和队列,方便各位理解原理和如何自我实现(我反倒觉得自己的是实现比java自带的要方便,但是部分可以省去很多麻烦)。

1.用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode)

题面:

基本分析: 可以利用数组模拟数据结构,然后抽象出两个指针模拟队列边界,那么进出等操作其实是指针的移动

class MyQueue {//利用数组模型模拟一个队列int[] arr = new int[200];//运用双指针模拟队列边界int l =0;int r = 0;public MyQueue() {}public void push(int x) {arr[r++] = x;}public int pop() {return arr[l++];}public int peek() {return arr[l];}public boolean empty() {return (l>=r);}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

2.用队列模拟栈

题目链接:225. 用队列实现栈 - 力扣(LeetCode)

题面:

基本分析:数组模拟,并用一个指针表示头

class MyStack {//利用数组模拟栈int[] arr = new int[200];//定义head表示头int head = 0;public MyStack() {}public void push(int x) {arr[++head] = x;}public int pop() {return arr[head--];}public int top() {return arr[head];}public boolean empty() {return head==0;}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

3.有效的括号

题目链接:20. 有效的括号 - 力扣(LeetCode) 

题面:

基本分析:模拟一个栈,字符依次入栈,当栈头元素和要入栈的元素匹配时,头出栈而要入栈的元素不入栈

代码:

class Solution {public boolean isValid(String s) {int n = s.length();if(n%2==1)return false;int head = 0;char[] stack = new char[10005];for(char c:s.toCharArray()){if(stack[head]=='('&&c==')')head--;else if(stack[head]=='['&&c==']')head--;else if(stack[head]=='{'&&c=='}')head--;else stack[++head] = c;}return head==0;}
}

4.删除字符串中所有相邻重复项

题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode) 

题面:

 基本分析:这题和上一题思路一样

代码:

class Solution {public String removeDuplicates(String s) {char[] arr = new char[100005];int head=0;for(char c:s.toCharArray()){if(arr[head]==c)head--;else arr[++head]=c;}return new String(arr,1,head);}}

 5.逆波兰表达式求值

题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

题面:

基本分析: 我们将得到的数字以此压入栈中,每次拿到运算符时,取两个数进行运算,然后把运算结果再次存入栈中

代码:

class Solution {public int evalRPN(String[] tokens) {long[] arr = new long[10005];int head = 0;int n = tokens.length-1;for(int i =0;i<=n;i++){long number = Integer.MAX_VALUE;char c = ' ';try {number = Integer.valueOf(tokens[i]);} catch (Exception e) {number = Integer.MAX_VALUE;c = tokens[i].toCharArray()[0];}if(number!=Integer.MAX_VALUE)arr[++head]=number;else{if(c=='+'){arr[head-1] = arr[head]+arr[head-1];}else if(c=='-'){arr[head-1] = arr[head-1]-arr[head];}else if(c=='*'){arr[head-1] = arr[head-1]*arr[head];}else{arr[head-1] = arr[head-1]/arr[head];}head--;}}return (int)arr[1];}
}

6.滑动窗口最大值

题目链接:239. 滑动窗口最大值 - 力扣(LeetCode) 

题面:

基本分析: 这题用到单调队列,队列元素不完全递减,每次加入新元素要判断队列头元素有没有过期,然后从右边删去所有小于新加入元素的元素,然后把新元素加入,每次窗口的最大值就是队列的最左边元素,当然,未形成窗口前要另外单独讨论,代码如下:

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;int[] queue = new int[100010];int count = 0;int l =0;int r = 0;queue[0] = Integer.MIN_VALUE;int[] arr = new int[n-k+1];for(int i =-k+1,j=0;j<n;i++,j++){if(i<1){while(l<r&&queue[0]!=-100006&&queue[r-1]<nums[j])r--;queue[r++]=nums[j];if(i==0)arr[count++]=queue[l];}else{if(queue[l]==nums[i-1])l++;while(l<r&&queue[r-1]<nums[j])r--;queue[r++]=nums[j];arr[count++]=queue[l];}}return arr;}
}

7.前k个高频元素 

题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)

题面:

基本分析: 因为涉及到排序,可以使用优先队列(如果你不懂这个数据结构可以去了解一下,简单来说就是你用这个可以把队列里的数据排好序,每次取都是队列里的最值)

代码:

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();for(int num:nums){map.put(num,map.getOrDefault(num,0)+1);}PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>((a,b)->b.getValue()-a.getValue());queue.addAll(map.entrySet());int[] result = new int[k];for(int i = 0;i<k;i++){result[i] = queue.poll().getKey();}return result;}
}

后言 

上面是栈与队列一些最经典的题目,以后碰到其他好题也会更新,希望有所帮助,一同进步,共勉!

相关文章:

栈与队列-Java【力扣】【算法学习day.7】

前言 我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#…...

最新版本!IntelliJ IDEA 2024.2.4 (Ultimate Edition) 的新特性

IntelliJ IDEA 2024.2版本&#xff08;Ultimate Edition&#xff09;的关键新特性包括&#xff1a; 改进的Spring Data JPA支持&#xff1a; 允许在IDE中直接运行Spring Data JPA方法&#xff0c;进行即时仓库查询验证。 无需运行应用程序或分析日志文件&#xff0c;即可查看…...

从头学PHP之运算符

关于运算符的图片均来自网络&#xff0c;主要是自己写太麻烦了&#xff0c;程序是个简化自己工作量的方式&#xff0c;能复制粘贴就不要手写了&#xff08;建议初期还是多写写&#xff0c;加深下记忆&#xff09;在这里我就偷个懒&#xff0c;图片涉及到侵权及时&#xff0c;请…...

使用 Git LFS(大文件存储)

Git LFS&#xff08;Large File Storage&#xff09;是一种扩展 Git 的工具&#xff0c;旨在更有效地管理大文件的版本控制。它通过将大文件的内容存储在 Git 之外来解决 Git 在处理大文件时的性能问题。 主要特点 替代存储&#xff1a;Git LFS 不直接将大文件存储在 Git 仓库…...

js 将一维数组转换成树形结构的方法

一维数组的数据结构&#xff0c;如下 const flatArray [ { id: 1, parent_id: null, name: ‘root1’ }, { id: 2, parent_id: null, name: ‘root2’ }, { id: 3, parent_id: 1, name: ‘child1’ }, { id: 4, parent_id: 2, name: ‘child2’ }, { id: 5, parent_id: 3, nam…...

HarmonyOS NEXT开发实战:实现高效下拉刷新与上拉加载组件(二)刷新核心逻辑与空页面集成

前言: 在上一篇文章中,我们深入探讨了如何在HarmonyOS中实现一个功能完备的空页面组件。现在,我们将进入下拉刷新和上拉加载功能的核心逻辑实现。这不仅仅是技术实现,更是对用户体验的深刻理解。本文将详细介绍如何将空页面与下拉刷新、上拉加载逻辑相结合,打造一个既高效…...

Crawler4j在多线程网页抓取中的应用

网页爬虫作为获取网络数据的重要工具&#xff0c;其效率和性能直接影响到数据获取的速度和质量。Crawler4j作为一个强大的Java库&#xff0c;专门用于网页爬取&#xff0c;提供了丰富的功能来帮助开发者高效地抓取网页内容。本文将探讨如何利用Crawler4j进行多线程网页抓取&…...

【无标题】Django转化为exe,app

目录 1. 将 Django 项目转换为 .exe 文件(Windows)2. 将 Django 项目转换为 .app 应用程序(macOS)3. 发布到微信公众号将一个 Django 项目转换为 .exe 文件或 .app 应用程序,并发布到微信公众号,实际上涉及多个步骤和技术。下面我将分别介绍这些过程。 1. 将 Django 项目…...

HTML5_标签_各类表格的实现

目录 1. 表格标签 1.1 表格的主要作用 1.2 表格的基本语法 1.3 表头单元格标签 1.4 表格属性 案例分析 先制作表格的结构. 后书写表格属性. 代码示例: 1.5 表格结构标签 1.6 合并单元格 合并单元格方式&#xff1a; 目标单元格&#xff1a;(写合并代码) 合并单元…...

C语言数据结构之单向链表(SingleList)

C语言数据结构之单向链表&#xff08;SingleList&#xff09; 自定义结构体数据类型SListNode表示单向链表的节点&#xff0c;成员包括一个无类型的data用来存贮数据和一个SListNode本身类型的指针next&#xff0c;指向下一个节点。围绕SListNode写一系列函数以slist_开头实现…...

【银河麒麟高级服务器操作系统实例】金融行业TCP连接数猛增场景的系统优化

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理…...

详解Java的类文件结构(.class文件的结构)

this_class 指向常量池中索引为 2 的 CONSTANT_Class_info。super_class 指向常量池中索引为 3 的 CONSTANT_Class_info。由于没有接口&#xff0c;所以 interfaces 的信息为空。 对应 class 文件中的位置如下图所示。 06、字段表 一个类中定义的字段会被存储在字段表&#x…...

爆肝整理14天!AI工具宝藏合集

随着AI技术的飞速发展&#xff0c;各类AI工具如雨后春笋般涌现。经过对上百款AI工具的深入探索与测试&#xff0c;我精心挑选出了一些功能强大的AI神器&#xff0c;这些工具将极大地降低自媒体创作的门槛。 &#x1f680;无论是撰写文案、剪辑视频、设计图文&#xff0c;还是处…...

高效库存管理:金蝶云星空与管易云的盘亏单对接方案

高效库存管理&#xff1a;金蝶云星空与管易云的盘亏单对接方案 金蝶云星空与管易云的盘亏单对接方案 在企业日常运营中&#xff0c;库存管理是至关重要的一环。为了实现高效、准确的库存盘点和数据同步&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将金蝶云星空的数据…...

小鹏汽车股价分析:看涨信号已出现,技术指标显示还有40%的上涨空间

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小鹏汽车的股价过去几天有所回落。 &#xff08;2&#xff09;随着需求的上升&#xff0c;该公司的业务发展的还算不错。 &#xff08;3&#xff09;猛兽财经对小鹏汽车股价的技术分析&#xff1a;多头已经将目标指向15…...

c语言指针详解2

c语言指针详解2 1.数组名理解 数组名其实是地址&#xff0c;是数组首元素的地址&#xff08;详解1有提及&#xff09; 我们可以根据打印来确认 我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样&#xff0c;数组名就是数组⾸元素(第⼀个元素)的地址。 但是上述结论有…...

Chrome DevTools 二: Performance 性能面板

Chrome DevTools 第二篇 Performance 主要介绍performance在我们日常开发中所起到的作用&#xff0c;以及如何利用performance 面板进行性能分析和相关优化建议。 性能面板 Performance 记录和分析页面运行中的所有活动&#xff0c;是解决前端性能问题的重要工具。 1. 控制栏…...

渠道推广如何识别与防止虚假流量?

在当今竞争激烈的游戏市场中&#xff0c;渠道推广作为游戏开发商拓展用户基础、提升市场渗透率的关键手段&#xff0c;其重要性不言而喻。然而&#xff0c;随着市场的发展&#xff0c;渠道作弊问题日益严重&#xff0c;虚假流量、刷假量、拉人风险和违规代充等行为频繁出现&…...

Keil C51 9.61__官网“最新版“下载、安装及相关提示( 保姆级教程, 安装过程详解, 附安装包 )

前言 Keil 5常用的分两个版本&#xff0c;C51 和 MDK。C51用于编译8051内核的单片机程序&#xff0c;譬如AT89C51、STC89C51、STC98C52等。MDK用于编译STM32、GD32等ARM32位内核单片机程序。 ‌Keil C51‌是由Keil Software Company开发的&#xff0c;专门用于8051微控制器的…...

二进制搭建 Kubernetes v1.20

k8s集群master01etcd集群节点1192.168.190.80 kube-apiserver kube-controller-manager kube-scheduler etcdk8s集群node01etcd集群节点2192.168.190.60kubelet kube-proxy docker etcdk8s集群node02etcd集群节点3192.168.190.70etcd VIP192.168.190.100 k8…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

【Java】Ajax 技术详解

文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...