【数据结构_8】栈和队列

一、反向输出链表元素

Ⅰ使用递归进行反向输出

package stack;
public class Test2 {static class Node{public String val;public  Node next;//构造方法public Node(String val) {this.val = val;this.next = null;}}//利用递归来反向输出链表public static void reverse(Node head){if (head == null){return;}reverse(head.next);System.out.print(head.val+"  ");}public static Node build(){Node a = new Node("a");Node b = new Node("b");Node c = new Node("c");Node d = new Node("d");a.next = b;b.next= c;c.next =d ;return a;}public static void main(String[] args) {Node head = build();reverse(head);}
}

Ⅱ利用栈进行链表元素的反向输出

package stack;import java.util.Stack;public class Test2 {static class Node{public String val;public  Node next;//构造方法public Node(String val) {this.val = val;this.next = null;}}//利用栈来进行反向输出public static void reversePrint(Node head){//创建栈Stack<Node> stack = new Stack<>();//栈里面放的应该是节点,之后打印才可以通过节点引出他门的val//1.首先判断特殊情况if(head== null){return;}//把链表元素进行入栈操作for(Node cur = head;cur!= null;cur = cur.next){stack.push(cur);}while(!stack.isEmpty()){System.out.print(stack.pop().val);}}public static Node build(){Node a = new Node("a");Node b = new Node("b");Node c = new Node("c");Node d = new Node("d");a.next = b;b.next= c;c.next =d ;return a;}public static void main(String[] args) {Node head = build();reversePrint(head);}
}

三、有关stack的oj题

解题思路:

1.准备栈并且遍历字符串中的每个字符

2.如果发现当前字符是左括号,就直接入栈

3.如果发现当前字符是右括号,取出刚才的栈顶元素,用当前的右括号和栈顶左括号去判定匹配

如果是配对就继续往下遍历

如果不配对,返回false

class Solution {public boolean isValid(String s) {//首先创建一个栈 这个栈用来存放字符 所以类型选用的是CharacterStack<Character> stack = new Stack<>();//然后进行入栈操作for(int i =0 ;i<s.length();i++){char c = s.charAt(i);//如果是左括号就入栈if(c=='['||c=='('||c=='{'){stack.push(c);continue;}//如果是右括号,就进行判定括号匹配if(c==']'||c==')'||c=='}'){//取出栈顶元素//如果栈为空,无法取到栈顶//由于当前读到了一个右括号,要求必须得在栈里面有一个匹配的左括号//但是栈是空的,说明没有匹配的左括号,那么直接返回falseif(stack.isEmpty()){return false;}//取出栈顶元素char top = stack.pop();if(top =='['&& c==']'){continue;}if(top =='('&&c==')'){continue;}if(top =='{'&& c =='}'){continue;}//其他情况,匹配失效return false;}}//整个循环结束,再来检查栈是否为空//如果栈为空,说明所有括号都匹配成功//如果栈不为空,说明还有未匹配的左括号if(stack.isEmpty()){return true;}return false;}
}

class Solution {public static Boolean isNum(String token){//如果token是运算符,就返回false,否则就返回trueif(token.equals("+")||token.equals("-")||token.equals("*")||token.equals("/")){return false;}return true;}public int evalRPN(String[] tokens) {//1.准备一个栈,用来存放操作数Stack<Integer> stack = new Stack<>();//2.遍历tokens,取出每个元素for(String token:tokens){//3.判断token是数字if(isNum(token)){//直接入栈stack.push(Integer.parseInt(token));continue;}//4.判定token是运算符//出栈两个元素,先出栈的是第二个操作数,后出栈的是第一个操作数int num2 = stack.pop();int num1 = stack.pop();//5.判定当前的运算符是哪个并且进行运算把得到的结果重新入栈if(token.equals("+")){stack.push(num1+num2);}else if(token.equals("-")){stack.push(num1-num2);}else if(token.equals("*")){stack.push(num1*num2);}else if(token.equals("/")){stack.push(num1/num2);}}//最终整个表达式的结果就是栈里的唯一一个元素return stack.pop();}
}

解题思路:1.先有一个栈

2.遍历pushA,把每个元素,依次出栈

3.在每次入栈一个元素之后,都拿着popA进行判定

a)检测栈是否未空

b)如果栈不为空,判定栈顶元素是不是等于popA的当前元素

c)如果发现符合上述要求

出栈,并且增加popA的下标

出栈成功,回到(a)继续循环处理

d)如果不符合上述要求,回到2.继续遍历下一个pushA元素

4.pushA遍历完毕之后,如果栈为空,说明当前的结果就是true,如果栈不为空,说明结果就是false。

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pushV int整型一维数组 * @param popV int整型一维数组 * @return bool布尔型*/public boolean IsPopOrder (int[] pushV, int[] popV) {// write code here//1.准备一个栈Stack<Integer> stack = new Stack<>();//2.针对pushV进行遍历int pushIndex =0;int popIndex = 0;for(;pushIndex <pushV.length;pushIndex++){//3.把当前的pushIndex指向的元素入栈stack.push(pushV[pushIndex]);//4.拿着popV的当前元素和栈顶进行比较,循环比较的过程,只要比较成功就出栈,并且进行下次循环//也就是比较popA的下一个元素和栈顶的元素while(!stack.isEmpty() && stack.peek()==popV[popIndex]){stack.pop();popIndex++;}//上述条件不匹配,说明当前popIndex指向的元素和栈顶元素是不一样的//此时就需要再次入栈新的元素找新的机会//此处结束循环进入下次即可}//5.当中整个pushA遍历完毕,说明“所有的机会”都用完了//此时如果栈已经是空了,说明前面popA的元素就都匹配成功;如果栈非空,还有popA的元素是无法匹配的if(stack.isEmpty()){return true;}return false;}
}

class MinStack {private Stack<Integer> stack1 = new Stack<>();private Stack<Integer> stack2 = new Stack<>();public MinStack() {// 这个方法空着就行了, 不需要.}public void push(int val) {// stack1 就是正常入栈.stack1.push(val);// 针对 stack2, 就需要比较 val 和 stack2 栈顶元素的大小, 把小的元素入栈.if (stack2.isEmpty()) {// 如果 stack2 栈为空, 直接入栈.stack2.push(val);return;}int min = stack2.peek();if (val < min) {stack2.push(val);} else {stack2.push(min);}}public void pop() {if (stack1.isEmpty()) {// 在做 OJ 题的时候, 不要抛出异常.return;}// 把这两个栈的元素都出栈.stack1.pop();stack2.pop();}public int top() {// 取正常的栈顶元素.if (stack1.isEmpty()) {// 由于不是 Integer, 无法返回 null. 而且右不能修改人家方法的返回值类型. 此处就返回 0 .return 0;}return stack1.peek();}public int getMin() {// 取 stack2 栈顶元素.if (stack2.isEmpty()) {return 0;}return stack2.peek();}
}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(val);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.getMin();*/

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

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

相关文章

Java 正则表达式综合实战:URL 匹配与源码解析

在 Web 应用开发中&#xff0c;我们经常需要对 URL 进行格式验证。今天我们结合 Java 的 Pattern 和 Matcher 类&#xff0c;深入理解正则表达式在实际应用中的强大功能&#xff0c;并剖析一段实际的 Java 示例源码。 package com.RegExpInfo;import java.util.regex.Matcher; …

虾分发平台平台优势

平台优势 高效与成本优化 一键分发与自动化工具减少人工操作&#xff0c;加速测试周期&#xff1b;免费分发流量和透明价格套餐降低中小团队开支。 安全与合规 自研CDN与封装技术平衡性能与安全性&#xff0c;适配复杂分发场景&#xff1b;全球CDN网络加速保障极速下载。 服务…

c语言学习16——内存函数

内存函数 一、memcpy使用和模拟实现1.1参数1.2 使用1.3 模拟实现 二、memmove使用和模拟实现2.1 参数2.2 使用2.3 模拟实现 三、memset使用3.1 参数3.2 使用 四、memcmp使用4.1 参数4.2 使用 一、memcpy使用和模拟实现 1.1参数 因为内存中不知道存的是什么类型的地址&#xff…

TLA:用于接触-丰富操作的触觉-语言-动作模型

25年3月来自三星中国研发中心、中科院自动化所和北京智源的论文“TLA: Tactile-Language-Action Model for Contact-Rich Manipulation”。 视觉-语言模型已取得显著进展。然而&#xff0c;在语言条件下进行机器人操作以应对接触-密集型任务方面&#xff0c;仍未得到充分探索&…

【JavaEE】SpringBoot 统一功能处理

目录 一、拦截器1.1 使用1.1 定义拦截器1.2 注册配置拦截器 1.2 拦截器详解1.2.1 拦截路径1.2.2 拦截器执⾏流程 1.3 适配器模式 二、统一数据返回格式2.1 简单用法2.2 问题及解决 三、统一异常处理 一、拦截器 拦截器&#xff1a;拦截器是Spring框架提供的核⼼功能之⼀&#…

【前端实战】使用 BroadcastChannel API 实现跨标签页通信

一、引言 在现代 Web 应用开发中&#xff0c;我们常常会遇到需要在不同浏览器标签页之间进行通信的需求。例如&#xff0c;在一个电商应用中&#xff0c;用户在一个标签页中添加商品到购物车&#xff0c;希望在其他标签页中也能实时显示购物车的更新信息。传统的实现方式可能会…

微信小程序 - [渲染层错误] Uncaught TypeError: Cannot read property ‘D‘ of undefined

问题&#xff1a;[渲染层错误] Uncaught TypeError: Cannot read property D of undefined 解决&#xff1a; 该错误可能还是小程序的渲染模式有关系&#xff0c;查看app.json中是否有如下配置&#xff0c;删除即可&#xff0c;或者降低小程序调试基础库版本。

【MySQL高级】事务,存储引擎,索引(一)

Mysql高级 DQL查询语句 反引号 模糊查询避免%出现在开头,会造成索引失效 order by排序先后 表名列名都需要用${}&#xff0c;他们不能带’’ 去重统计数量 null的运算 分组函数会自动忽略null&#xff0c;不用对null进行处理 截取子串substr&#xff08;字段&#xff0c;下标…

面试篇 - GPT-1(Generative Pre-Training 1)

GPT-1&#xff08;Generative Pre-Training 1&#xff09; ⭐模型结构 Transformer only-decoder&#xff1a;GPT-1模型使用了一个12层的Transformer解码器。具体细节与标准的Transformer相同&#xff0c;但位置编码是可训练的。 注意力机制&#xff1a; 原始Transformer的解…

ubuntu24.04 cmake 报错 libldap-2.5.so.0 解决办法

apt cmake有毛病 换源重新安装 wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" sudo apt update sudo apt in…

ScholarCopilot:“学术副驾驶“

这里写目录标题 引言&#xff1a;学术写作的痛点与 AI 的曙光ScholarCopilot 的核心武器库&#xff1a;智能生成与精准引用智能文本生成&#xff1a;不止于“下一句”智能引用管理&#xff1a;让引用恰到好处 揭秘背后机制&#xff1a;检索与生成的动态协同快速上手&#xff1a…

vivo X200 Ultra前瞻系列(2):vivo X200 Ultra影像技术沟通会总结

vivo于今日(2025年4月14日)举办的“X系列蓝图影像技术沟通会”中,正式发布了vivo X200 Ultra,展示了其在移动影像领域的多项技术突破。以下是本次沟通会的核心内容总结: 1. 硬件革新:蔡司三焦段镜头与双芯架构 蔡司三大定焦大师镜头: X200 Ultra采用14mm超广角(“鹰眼”…

代码随想录第17天:二叉树

一、二叉搜索树的最近公共祖先&#xff08;Leetcode 235&#xff09; 由于是二叉搜索树&#xff0c;节点的值有严格的顺序关系&#xff1a;左子树的节点值都小于父节点&#xff0c;右子树的节点值都大于父节点。利用这一点&#xff0c;可以在树中更高效地找到最低公共祖先。 c…

C++中string库常用函数超详细解析与深度实践

目录 一、引言 二、基础准备&#xff1a;头文件与命名空间 三、string对象的创建与初始化(基础&#xff09; 3.1 直接初始化 3.2 动态初始化&#xff08;空字符串&#xff09; 3.3 基于字符数组初始化 3.4 重复字符初始化 四、核心函数详解 4.1 字符串长度相关 4.1.1 …

LanDiff:赋能视频创作,语言与扩散模型的融合力量

自从 Wan 2.1 发布以来&#xff0c;AI 视频生成领域似乎进入了一个发展瓶颈期&#xff0c;但这也让人隐隐感到&#xff1a;“DeepSeek 时刻”即将到来&#xff01;就在前几天&#xff0c;浙江大学与月之暗面联合推出了一款全新的文本到视频&#xff08;T2V&#xff09;生成模型…

【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言宝塔安装DockerMinIO 安装与设置cploar内网穿透PicGo下载与安装typora安装总结互动…

centos-LLM-生物信息-BioGPT-使用1

参考&#xff1a; GitHub - microsoft/BioGPT https://github.com/microsoft/BioGPT BioGPT&#xff1a;用于生物医学文本生成和挖掘的生成式预训练转换器 |生物信息学简报 |牛津学术 — BioGPT: generative pre-trained transformer for biomedical text generation and mini…

高效爬虫:一文掌握 Crawlee 的详细使用(web高效抓取和浏览器自动化库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Crawlee概述1.1 Crawlee介绍1.2 为什么 Crawlee 是网页抓取和爬取的首选?1.3 为什么使用 Crawlee 而不是 Scrapy1.4 Crawlee的安装二、Crawlee的基本使用2.1 BeautifulSoupCrawler的使用方式2.2 ParselCrawler的使…

架构总览怎么写,才算工业级?

📈系统架构文档是整个项目最重要的起点,但很多人第一章就“写穿了”: 不是写得太细,就是没有重点。想要写出高质量、能协作、能传承的架构文档,这一篇会告诉你应该怎么做—— ✅ 架构总览的终极目标 明确边界、定义角色、画清数据流 别讲执行细节,别深入函数调用。 ✅ 架…

优先级队列(堆二叉树)底层的实现:

我们继续来看我们的优先级队列&#xff1a; 优先级队列我们说过&#xff0c;他也是一个容器适配器&#xff0c;要依赖我们的容器来存储数据&#xff1b; 他的第二个参数就是我们的容器&#xff0c;这个容器的默认的缺省值是vector&#xff0c;然后他的第三个参数&#xff0c;我…