算法题目总结-栈和队列

文章目录

    • 1.有效的括号
        • 1.答案
        • 2.思路
    • 2.最小栈
        • 1.答案
        • 2.思路
    • 3.前 K 个高频元素
        • 1.答案
        • 2.思路
    • 4.用栈实现队列
        • 1.答案
        • 2.思路
    • 5.删除字符串中的所有相邻重复项
        • 1.答案
        • 2.思路

1.有效的括号

1.答案
package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Description: 20. 有效的括号** @Author sun* @Create 2025/1/15 09:37* @Version 1.0*/
public class t20 {public static boolean isValid(String s) {// 栈Stack<Character> stack = new Stack<>();// 遍历for (int i = 0; i < s.length(); i++) {// 如果是左括号就入栈char c = s.charAt(i);if (c == '(' || c == '{' || c == '[') {stack.push(c);}// 如果是右括号,就进行匹配if (c == ')' || c == '}' || c == ']') {// 如果栈为空,就返回falseif (stack.isEmpty()) {return false;}// 从栈中获取一个左括号进行匹配Character pop = stack.pop();boolean match = match(pop, c);if (!match) {return false;}}}return stack.isEmpty();}/*** 匹配** @param left* @param right* @return*/private static boolean match(Character left, Character right) {if (left == '(' && right == ')') {return true;}if (left == '{' && right == '}') {return true;}if (left == '[' && right == ']') {return true;}return false;}
}
2.思路

就是左括号入栈,右括号匹配,但是需要注意的是右括号在匹配左括号之前栈不能为空,并且最后所有的右括号都匹配完了栈也不能为空

2.最小栈

1.答案
package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Description: 155. 最小栈** @Author sun* @Create 2025/1/15 09:51* @Version 1.0*/
public class MinStack {/*** 辅助栈*/private Stack<Integer> stack;/*** 最小栈*/private Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();// 初始化为一个最大的元素minStack.push(Integer.MAX_VALUE);}public void push(int val) {// 压栈压最小stack.push(val);minStack.push(Math.min(val, minStack.peek()));}public void pop() {// pop都出去stack.pop();minStack.pop();}public int top() {return stack.peek();}public int getMin() {return minStack.peek();}
}
2.思路

最小栈初始化一个最大值,压栈压最小,pop都出去,这样就能保证最小栈的栈顶是目前的最小元素

3.前 K 个高频元素

1.答案
package com.sunxiansheng.arithmetic.day10;import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;/*** Description: 347. 前 K 个高频元素** @Author sun* @Create 2025/1/15 10:06* @Version 1.0*/
public class t347 {public static 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>> pq =new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());// 将map的元素放到大顶堆中for (Map.Entry<Integer, Integer> entry : map.entrySet()) {pq.offer(entry);}// 从大顶堆中取出前k个元素int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = pq.poll().getKey();}return res;}
}
2.思路

统计频率之后将其放到大顶堆中,然后取出前k个元素即可

4.用栈实现队列

1.答案
package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Description: 232. 用栈实现队列** @Author sun* @Create 2025/1/15 10:19* @Version 1.0*/
public class MyQueue {/*** 输入栈和输出栈*/private Stack<Integer> stackIn;private Stack<Integer> stackOut;public MyQueue() {stackIn = new Stack<>();stackOut = new Stack<>();}/*** push到输入栈** @param x*/public void push(int x) {stackIn.push(x);}/*** 如果输出栈是空的,就将输入栈的元素全都放到输出栈** @return*/public int pop() {if (stackOut.isEmpty()) {while (!stackIn.isEmpty()) {stackOut.push(stackIn.pop());}}return stackOut.pop();}/*** 如果输出栈是空的,就将输入栈的元素全都放到输出栈** @return*/public int peek() {if (stackOut.isEmpty()) {while (!stackIn.isEmpty()) {stackOut.push(stackIn.pop());}}return stackOut.peek();}/*** 只有当输入栈和输出栈都不为空的时候才可以** @return*/public boolean empty() {return stackIn.isEmpty() && stackOut.isEmpty();}
}
2.思路

两个栈可以实现队列的原理就是,一个输入栈输入,然后需要输出的时候就将输入栈中的元素放到输出栈中,这样负负得正,就是顺序的了

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

1.答案
package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Description: 1047. 删除字符串中的所有相邻重复项** @Author sun* @Create 2025/1/15 10:29* @Version 1.0*/
public class t1047 {public static String removeDuplicates(String s) {// 栈Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {// 当前元素char c = s.charAt(i);// 如果栈不为空,并且匹配成功的才会出栈,否则就是栈为空或者是栈不为空但是匹配失败的情况,就入栈if (!stack.isEmpty() && stack.peek() == c) {stack.pop();} else {stack.push(c);}}// 将栈中的元素倒序char[] chars = new char[stack.size()];for (int i = chars.length - 1; i >= 0; i--) {chars[i] = stack.pop();}return new String(chars);}
}
2.思路

如果栈不为空,并且匹配成功的才会出栈,否则就是栈为空或者是栈不为空但是匹配失败的情况,就入栈

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

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

相关文章

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一个整体。MySQL提供一种机制&#xff0c;保证我们…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

arkime安装

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置&#xff0c;覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码&#xff0c;可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRe…

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识&#xff1a; 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…

自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving

1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…

BGP分解实验·9——路由聚合与条件性通告(1)

路由聚合是有效控制缩减BGP路由表的方法之一&#xff0c;路由聚合的前提和IGP一样&#xff0c;需要有路由目标存在BGP表中&#xff0c;与IGP不同的是&#xff0c;BGP路由聚合可以定义按需抑制路由的能力。 实验拓扑如下所示&#xff1a; 现在开始把从R1的R5的基础配置先准备好…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

SpringMVC 实战指南:文件上传

第一章&#xff1a;常用的注解&#xff1a; RequestParam 注解&#xff1a; 作用&#xff1a;把请求中的指定名称的参数传递给控制器中的形参赋值属性&#xff1a; value&#xff1a;请求参数中的名称required&#xff1a;请求参数中是否必须提供此参数&#xff0c;默认值是 tr…

【部署】将项目部署到云服务器

目录 1.获得服务器 2.连接到云服务器 3.配置环境 3.1.Java&#xff08;运行后端所需&#xff09; 3.2.MySQL数据库 3.3.Nginx&#xff08;运行前端所需&#xff09; 3.4. Node.js&#xff08;构建前端所需&#xff09; 4.打包项目 4.1.打包后端项目 4.2.打包前端项目…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

“Cultural diversity” 和 “multicultural”应用场景区别

“Cultural diversity” 和 “multicultural” 都涉及到不同文化的存在和互动&#xff0c;但它们在使用时有细微的差别&#xff0c;主要体现在侧重点和语境上。以下是它们各自的应用场景&#xff1a; 1. Cultural Diversity&#xff08;文化多样性&#xff09; 定义&#xff…

在 Linux 和 Windows 下查看文件 MD5 值的几种方法

MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常见的哈希算法&#xff0c;用于生成文件的唯一“指纹”。它在文件传输和验证过程中非常有用&#xff0c;能够确保文件未被篡改。本文将介绍在 Linux 和 Windows 下查看文件 MD5 值的几种方法&#xff0c;并分别列…

QT 占位符的用法

这段代码是 Qt 中常用的字符串格式化方法&#xff0c;用于动态生成带有变量值的字符串。以下是详细的拆解和解释&#xff1a; QString("Elapsed time: %1 seconds").arg(elapsed_seconds.count())1. QString 的构造 QString(“Elapsed time: %1 seconds”) 创建了一…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

如何通过云计算优化网站性能?

随着互联网的迅猛发展&#xff0c;网站的性能已经成为用户体验的关键因素之一。响应速度慢、加载时间长&#xff0c;甚至服务器崩溃都会直接影响用户的满意度&#xff0c;进而影响企业的品牌形象和盈利能力。而云计算提供了一个高效、灵活、可扩展的解决方案&#xff0c;帮助企…