JAVA栈相关习题3

news/2024/5/20 13:57:12

1.将递归转化为循环

比如:逆序打印链表
// 递归方式void printList(Node head){if(null != head){printList(head.next);System.out.print(head.val + " ");}}
// 循环方式void printList(Node head){if(null==head){return;}Stack<Node> s=new Stack<>();
// 将链表中的结点保存在栈中Node cur=head;while(null!=cur){s.push(cur);cur=cur.next;}// 将栈中的元素出栈while(!s.empty()){System.out.print(s.pop().val+" ");}}
public void show3(ListNode head) {if(head == null) {return;}if(head.next == null) {System.out.println(head.val);return;}show3(head.next);System.out.println(head.val);}public void show4() {Stack<ListNode> stack = new Stack<>();ListNode cur = head;while (cur != null) {stack.push(cur);cur = cur.next;}//依次出栈while (!stack.empty()) {ListNode tmp = stack.pop();System.out.println(tmp.val);}}

2.括号匹配

(1)闭合顺序不对([)]

(2)左括号多了(()

(3)右括号多了())

结论:

1.当括号是匹配的时候,最终i遍历完了字符串,并且栈为空

2.遇到不匹配的就直接结束

3.当i遍历完了字符串,但是栈当中仍然有括号,则必定是左括号多了(肯定不匹配)

4.当栈空了,但是字符串还没有遍历完,则必定不匹配

思考:如何判断匹配

https://leetcode.cn/problems/valid-parentheses/description/

 

class Solution {public boolean isValid(String s) {Stack<Character> stack=new Stack<>();for(int i=0;i<s.length();i++){char ch=s.charAt(i);if(ch=='('||ch=='['||ch=='{'){//左括号入栈,因为左括号一定是符号最开始的部分stack.push(ch);}else{//是右括号的情况if(stack.empty()){return false;}else{char tmp=stack.peek();if((tmp=='('&&ch==')')||(tmp=='['&&ch==']')||(tmp=='{'&&ch=='}')){//括号匹配成功stack.pop();}else{return false;}}}}if(!stack.empty()){return false;}return true;}
}

 3.逆波兰表达式

150. 逆波兰表达式求值 - 力扣(LeetCode)

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack=new Stack<>();for(String s:tokens){if(!isOpera(s)){//数字:放入栈当中stack.push(Integer.parseInt(s));//将字符串转成整数}else{//弹出栈顶的两个元素int num2=stack.pop();int num1=stack.pop();switch(s){case "+":stack.push(num1+num2);break;case "-":stack.push(num1-num2);break;case "*":stack.push(num1*num2);break;case "/":stack.push(num1/num2);break;}}}return stack.pop();}public boolean isOpera(String s){if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}return false;}
}

4.栈的压入、弹出序列

1)何时入栈---每次都入

2)什么时候出栈

栈不为空的时候并且栈顶元素和k下标的元素相同时可以出栈

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

import java.util.*;public class Solution {public boolean IsPopOrder(int [] pushA,int [] popA) {Stack<Integer> stack = new Stack<>();int j = 0;//变量popA这个数组for (int i = 0; i < pushA.length; i++) {stack.push(pushA[i]);while (!stack.empty() && j < popA.length&& stack.peek() == popA[j]) {stack.pop();j++;}}return stack.empty();}
}

 5.最小栈

import java.util.Stack;class MinStack {private Stack<Integer> stack ;private Stack<Integer> minStack ;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {stack.push(val);//第一次在最小栈当中存储元素if(minStack.empty()) {minStack.push(val);}else {if(val <= minStack.peek()) {minStack.push(val);}}}public void pop() {//栈为空 则不能进行弹出元素if(stack.empty()) {return;}int val = stack.pop();if(val == minStack.peek()) {minStack.pop();}}//获取栈顶元素 和 最小栈没有关系public int top() {if(stack.empty()) {return -1;}return stack.peek();}//获取元素 不是删除元素public int getMin() {return minStack.peek();}}

1.入栈操作 stack正常入栈minStack 每次入栈的元素要和栈顶元素比较,如果比minStack 栈顶元素小,就要入栈。第一次入栈的时候,两个栈 都要放元素
2.出栈操作
stack这个栈正常出栈,但是每次出栈的时候都要和最小栈的栈顶元素比较,如果一样,此时两个栈 都要出元素。


http://www.mrgr.cn/p/20225546

相关文章

Qt元对象系统自带类型与注册类型

通过isRegistered()方法判断 在Qt跨线程传参时,使用信号槽connect或者调用QMetaInvokeMethon时,传递的参数的类型通常要注意是不是已在Qt的元对象系统中注册过了,Qt提供了方法来判断类型是否被注册: bool QMetaType::isRegistered(int type)其中参数是枚举类型,参数例子: …

将ESP工作为AP路由模式并当成服务器

将ESP8266模块通过usb转串口接入电脑 ATCWMODE3 //1.配置成双模ATCIPMUX1 //2.使能多链接ATCIPSERVER1 //3.建立TCPServerATCIPSEND0,4 //4.发送4个字节在链接0通道上 >ATCIPCLOSE0 //5.断开连接通过wifi找到安信可的wifi信号并连接 连接后查看自己的ip地址变为192.168.4.…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

添砖Java之路其二——基本数据类型,scanner,字符拼接。

目录 基本数据类型&#xff1a; ​编辑 Scanner: 字符拼接&#xff1a; 课后小题&#xff1a; 基本数据类型&#xff1a; 如图可见&#xff1a;Java里面有八种基本数据类型。 注意&#xff1a;在其中我们需要注意的是int默认整型数据&#xff0c;double是默认浮点型数据。因…

Vue-路由介绍

目录 一、思考引入 二、路由介绍 一、思考引入 单页面应用程序&#xff0c;之所以开发效率高&#xff0c;性能高&#xff0c;用户体验好&#xff0c;是因为页面按需更新。 而如果要按需更新&#xff0c;首先需要明确&#xff1a;访问路径和组件的对应关系。该关系通过路由来…

C++ | Leetcode C++题解之第77题组合

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> temp;vector<vector<int>> ans;vector<vector<int>> combine(int n, int k) {// 初始化// 将 temp 中 [0, k - 1] 每个位置 i 设置为 i 1&#xff0c;即 [0, k - 1] 存…

Java的BIO/NIO/AIO

1. Java中的BIO、NIO和AIO的基本概念及其主要区别 BIO (Blocking I/O): 传统的同步阻塞I/O模型。每个连接创建成功后都需要一个线程来处理&#xff0c;如果连接没有数据可读&#xff0c;则线程会阻塞在读操作上。这种模型简单易理解&#xff0c;但在高并发环境下会消耗大量系统…

软件系统安全设计规范(word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件资料清单列表部分文档…

locust:Python 分布式压力测试(带WebUI)

Locust 介绍 它采用纯 Python 实现,是一个分布式用户负载测试的工具。 使用基于 Requests 库的客户端发起请求,使编写脚本大大简化; 在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞 IO 和 coroutine 来实现网络层的并发请求。因此单台压力…

android基础-多线程

多线程&#xff1a; 创建子线程&#xff0c;子线程不允许直接更新UI&#xff0c;试想下如果多个线程去更新UI&#xff0c;则会造成资源错乱&#xff0c;如果枷锁就会使得代码冗余复杂。 android异步处理&#xff1a; 另一种异步多线程方法 doInBackground是在子线程中。

中电金信:看 “咨询+技术”如何引领数字化变革新风向

当前,新一轮创新技术和产业变革正在重塑全球的经济格局。日本政府及社会各界也从各个领域着手推进数字化。2021年,日本政府成立了“数字厅”,通过一系列举措推动数字化升级,希望将日本加速转型为数字经济的区域领导者,日本企业也积极开展数字化转型为业务创造价值。中电金…

吴恩达机器学习-第三课-第三周

吴恩达机器学习 学习视频参考b站:吴恩达机器学习 本文是参照视频学习的随手笔记,便于后续回顾。 强化学习(reinforce learning) 什么是强化学习 示例:如何让遥控飞机学会倒飞? 监督学习并不适用,因为很难有好的数据集 奖励函数,告诉飞机什么时候是表现好什么时候是表现…

蓝桥杯-地宫取宝

X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它…

Nginx负载均衡、动静分离Tomcat案例实战

一、前言 1)Tomcat是一款开源的、免费的WEB软件服务器,是隶属于Apache基金会旗下的,主要是用于去发布网站代码、提供网页信息服务的。用户通过浏览器可以实现网站页面的访问。 2)Tomcat WEB软件默认可以处理静态网页(Apache、Nginx),同时也可以处理动态网页,主要是处理…

【全开源】Java v7淘宝客APP源码-自营商城任务墙源码美团外卖CPS广告联

一、淘宝客源码 特色功能&#xff1a; 商品搜索与推荐&#xff1a;基于用户的搜索关键词&#xff0c;推荐优质商品&#xff0c;帮助用户快速找到符合需求的商品。商品详情展示&#xff1a;展示商品图片、描述、价格等信息&#xff0c;帮助用户更好地了解商品的各项特性。下单…

vue 语法2

【5】条件渲染和列表渲染 &#xff08;1&#xff09;条件渲染v-if v-else-if v-else 条件渲染根据表达式的真假值来渲染不同的元素或组件。 v-if&#xff1a;当表达式的值为真时&#xff0c;渲染该元素或组件。 v-else-if&#xff1a;当前面的 v-if 或 v-else-if 的表达式为假…

three.js基础之小案例

静态场景 <canvas id="mainCanvas"></canvas> <script type="importmap">{"imports": {"three": "./js/build/three.module.js","three/addons/": "./js/jsm/"}} </script> &l…

国密算法SM2-java实现

Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version> </dependency>工具类import java.math.BigInteger;public class Util {/*** 整形转换成网络传输…

黑客精神和白帽子

在当今数字化的世界里,黑客精神和白帽子的角色变得愈发重要。本文将探讨黑客精神的本质,介绍白帽子的概念和职责。 1、黑客精神 所谓的“黑客精神”,主要指的是一种探索计算机软件和硬件极限,追求技术创新和完善的文化态度和哲学理念。 黑客精神强调的是对知识的渴求,对于…

NFS工作原理(重要)

NFS工作流程 1.NFS服务端启动后、将自己的端口信息,注册到rpcbind服务中 2.NFS客户端通过TCP/IP的方式,连接到NFS服务端提供的rpcbind服务,并且从该服务中获取具体的端口信息 3.NFS客户端拿到具体端口信息后,将自己需要执行的函数,通过网络发给NFS服务端对应的端口 4.NFS服…