LeetCode ACM模式——栈与队列篇

目录

232. 用栈实现队列

225. 用队列实现栈

20. 有效的括号

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

150. 逆波兰表达式求值

239. 滑动窗口最大值

347. 前 K 个高频元素


刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false
import java.util.ArrayDeque;
import java.util.Deque;/*** @author light* @Description 用栈实现队列**  定义两个栈,一个输入栈,一个输出栈*    入栈操作:将所有元素加入发到输入栈中*    出栈操作:要实现队列的先进先出,首先先判断输出栈中是否为空,如果为空,则将输入栈*      	   中的元素全部加入输出栈中,从输出栈中将元素弹出,以实现队列先进先出的功能* @create 2023-08-11 16:56*/
public class MyQueueTest {public static void main(String[] args) {MyQueue obj = new MyQueue();obj.push(1);obj.push(2);int param_3 = obj.peek();System.out.println(param_3);int param_2 = obj.pop();System.out.println(param_2);boolean param_4 = obj.empty();System.out.println(param_4);}}
class MyQueue {Deque<Integer> stackIn;Deque<Integer> stackOut;public MyQueue() {stackIn=new ArrayDeque<>();stackOut=new ArrayDeque<>();}public void push(int x) {stackIn.push(x);}public int pop() {dumpstackIn();return stackOut.pop();}public int peek() {dumpstackIn();return stackOut.peek();}public boolean empty() {return stackIn.isEmpty()&&stackOut.isEmpty();}public void dumpstackIn(){if(stackOut.isEmpty()){//如果输出栈中为空,将输入栈中所有元素加入到输出栈中while(!stackIn.isEmpty()){stackOut.push(stackIn.pop());}}}
}

225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
package com.light.code.leetcode.stack_queue;import java.util.Deque;
import java.util.LinkedList;/*** @author light* @Description 用队列实现栈**利用两个队列版另一种方法:直接使用ArrayDeque双端队列进行实现** @create 2023-08-11 17:28*/
public class MyStackTest {public static void main(String[] args) {MyStack myStack = new MyStack();myStack.push(1);myStack.push(2);System.out.println(myStack.top()); // 返回 2System.out.println(myStack.pop()); // 返回 2System.out.println(myStack.empty()); // 返回 False}
}
class MyStack {Deque<Integer> que1;Deque<Integer> que2;public MyStack() {que1=new LinkedList<>();que2=new LinkedList<>();}public void push(int x) {que1.add(x);}public int pop() {while(que1.size()!=1){que2.add(que1.pop());}int res=que1.pop();while(!que2.isEmpty()){que1.add(que2.pop());}return res;}public int top() {return que1.peekLast();}public boolean empty() {return que1.isEmpty();}
}

20. 有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
输入:s = "()"
输出:true
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;/*** @author light* @Description 有效的括号** 采用栈解决* @create 2023-08-11 18:14*/
public class IsValidTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String s=input.next();boolean res = isValid(s);System.out.println(res);}public static boolean isValid(String s) {Deque<Character> stack=new ArrayDeque<>();for (int i = 0; i < s.length(); i++) {char ch=s.charAt(i);if(ch=='('){stack.push(')');} else if (ch=='{') {stack.push('}');}else if (ch=='[') {stack.push(']');} else if (stack.isEmpty()||ch!=stack.peek()) {return false;}else {stack.pop();}}return stack.isEmpty();}
}

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

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;/*** @author light* @Description 删除字符串中的所有相邻重复项* @create 2023-08-11 18:39*/
public class RemoveDuplicatesTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String s=input.next();s=removeDuplicates(s);System.out.println(s);}public static String removeDuplicates(String s) {Deque<Character> que=new ArrayDeque<>();que.push(s.charAt(0));for (int i = 1; i < s.length(); i++) {char ch=s.charAt(i);if(!que.isEmpty()&&ch==que.peek()){que.pop();}else {que.push(ch);}}String s1="";while(!que.isEmpty()){s1=que.pop()+s1;}return s1;}
}

150. 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;/*** @author light* @Description 逆波兰表达式求值** (利用栈* @create 2023-08-12 13:36*/
public class EvalRPNTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);String[] tokens=input.next().split(",");int res=evalRPN(tokens);System.out.println(res);}public static int evalRPN(String[] tokens) {Deque<Integer> stack=new ArrayDeque<>();for (String s:tokens){if ("+".equals(s)) {stack.push(stack.pop()+stack.pop());} else if ("-".equals(s)) {//注意这里先入栈的作为减数stack.push(-stack.pop()+stack.pop());} else if ("*".equals(s)) {stack.push(stack.pop()*stack.pop());} else if ("/".equals(s)) {//注意这里先入栈的作为除数int temp1=stack.pop();int temp2=stack.pop();stack.push(temp2/temp1);}else {stack.push(Integer.parseInt(s));}}return stack.peek();}
}

239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7
package com.light.code.leetcode.stack_queue;import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;/*** @author light* @Description 滑动窗口最大值** 自定义队列:队列口中始终存放滑动窗口中的最大值;队内元素单调递减* @create 2023-08-12 14:18*/
public class MaxSlidingWindowTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}int k=input.nextInt();int[] res=maxSlidingWindow(nums,k);System.out.println(Arrays.toString(res));}public static int[] maxSlidingWindow(int[] nums, int k) {MyQue que=new MyQue();int[] res=new int[nums.length-k+1]; //定义结果数组int index=0;for (int i = 0; i < k; i++) {que.add(nums[i]);}res[index++]=que.getMaxValue();for (int i = k; i < nums.length; i++) {//维持滑动窗口,保证队列头部元素是该滑动窗口的最大值que.pop(nums[i-k]);que.add(nums[i]);res[index++]=que.getMaxValue();}return res;}
}
//自定义队列
class MyQue{Deque<Integer> que=new LinkedList<>();//添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出//保证队列元素单调递减//比如此时队列元素3,1;2将要入队,2比1大,所以1弹出,此时队列:3,2public void add(int x){while(!que.isEmpty()&&que.getLast()<x){que.removeLast();}que.add(x);}//获取滑动窗口内最大值public int getMaxValue(){return que.peek();}public void pop(int x){if(!que.isEmpty()&&x==que.peek()){que.poll();}}
}

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
import java.util.*;/*** @author light* @Description 前k个高频元素**(利用小顶堆,堆中只维护k个元素* @create 2023-08-12 15:55*/
public class TopKFrequentTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();int[] nums=new int[n];for (int i = 0; i < n; i++) {nums[i]=input.nextInt();}int k=input.nextInt();int[] res=topKFrequent(nums,k);System.out.println(Arrays.toString(res));}public static int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map=new HashMap<>();//key:元素;value:元素所出现的频率for (int i = 0; i < nums.length; i++) {map.put(nums[i],map.getOrDefault(nums[i],0)+1);}//按小顶堆排序(从小到大排PriorityQueue<Integer> que=new PriorityQueue<>(k, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return map.get(o1)-map.get(o2);}});for (Integer key:map.keySet()){if(que.size()<k){que.add(key);}else if(map.get(key)>map.get(que.peek())){que.poll();que.add(key);}}int[] res=new int[k];for (int i = 0; i < res.length; i++) {res[i]=que.poll();}return res;}
}

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

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

相关文章

如何做线上监控

1、背景 软件的质量是需要全生命周期进行关注的,在生产环境下QA的活动就是测试右移,测试右移最关键的手段就是线上监控,也是至关重要的一个环节,可以通过技术的手段,提前感知到线上问题和风险,先于用户提前发现问题,提升服务可感知性,从而降低客户投诉。 2、通用原则…

LabVIEW开发图像采集和基于颜色的隔离

LabVIEW开发图像采集和基于颜色的隔离 在当今的工业和工厂中&#xff0c;准确性和精度是决定特定行业生产力的两个重要关键点。为了优化生产力&#xff0c;各行各业正在从手动操作转向自动操作和控制。机器人技术在工业过程中的出现为人类提供了机械辅助。机器视觉在工业机器人…

易服客工作室:WordPress 6.3性能改进

随着WordPress 6.3发布&#xff0c;本文总结了该版本的性能改进。虽然WordPress 6.2显著提高了Core的加载时间性能&#xff0c;树立了很高的标准&#xff0c;但WordPress 6.3性能改进已经超越了这些结果&#xff1a;根据进行的性能基准测试&#xff0c;与WordPress 6.2相比&…

为什么这么设计—— Go的GC

Go语言采用了3色标记清理法来对内存进行自动垃圾回收&#xff0c; 过程是这样的&#xff1a; &#xff08;1&#xff09;起初所有的对象都是白色的&#xff1b; &#xff08;2&#xff09;从根对象出发扫描所有可达对象&#xff0c;标记为灰色&#xff0c;放入待处理队列&…

Java GUI,mybatis实现资产管理系统

Java GUI——资产管理系统 前言&#xff1a;为了做java课设&#xff0c;学了一手Java GUI。感觉蛮有意思的&#xff0c;写写文章&#xff0c;做个视频记录一下。欢迎大家友善指出我的不足 资产管理系统录制视频&#xff0c;从头敲到尾 模块划分 资产信息管理 资产信息查询 …

Vue实现详细界面里面有一个列表

目录 Vue实现详细界面里面有一个列表 理一下思路&#xff1a; 效果如下&#xff1a; 1、 主页面正常写 2、详细界面(重点) 3、详细界面里面的列表(重点) 要点&#xff1a; Vue实现详细界面里面有一个列表 理一下思路&#xff1a; 1、首先需要这条数据的主键id&#xff…

CAD练习——绘制电风扇

注意要在三维空间内完成绘制 先绘制扇叶 两条射线确定角度 绘制圆弧&#xff08;圆修剪&#xff09; 绘制扇叶形状&#xff08;3点圆弧&#xff09; 圆角&#xff1a; 将这几段圆弧合成同一条多段线 换个立体视图 拉伸出厚度 绘制一个球 取二者交集&#xff08;带弧面的扇叶&a…

每日一题 34在排序数组中查找元素的第一个和最后一个位置(二分查找)

题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&…

【博客698】为什么当linux作为router使用时,安装docker后流量转发失败

为什么当linux作为router使用时&#xff0c;安装docker后流量转发失败 场景 当一台linux机器作为其它服务器的router&#xff0c;负责转发流量的时候&#xff0c;让你在linux上安装docker之后&#xff0c;就会出现流量都被drop掉了 原因 没装docker之前&#xff1a; [root~]…

201、仿真-基于51单片机PT100测温设计铂电阻温度计设计Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、设计功能 二、Proteus仿真图 三、原理图 四、程序源码 资料包括&#xff1a; 方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设…

Linux 基础(八)常用命令 - ps kill pstree top netstat crontab

ps & kill & pstree & top & netstat & crontab pskillpstreetopnetstatcrontab ps process status 查看进程状态 基本语法 以下分别是两种方式查看本地进程信息。 查看所有进程&#xff0c;父进程id ps -ef 查看所有进程&#xff0c;资源占用 ps aux […

Clion开发STM32之HAL库I2C封装(基础库)

前言 引用参考: Clion开发STM32之HAL库GPIO宏定义封装(最新版) 头文件 /*******************************************************************************Copyright (c) [scl]。保留所有权利。***********************************************************************…

excel将主信息和明细信息整理为多对多(每隔几行空白如何填充)

excel导出的数据是主信息和明细信息形式。 方法如下:1、首先&#xff0c;从第一个单元格开始选中要填充的数据区域。2、按CtrlG或者F5调出定位对话框&#xff0c;点击左下角的【定位条件】。3、在【定位条件】中选择【空值】&#xff0c;然后点击【确定】按钮。4、按照上述操作…

Nodejs+vue+elementui汽车租赁管理系统_1ma2x

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui, 课题主要分为三大模块&#xff1a;即管理员模块、用户模块和普通管理员模块&#xff0c;主要功能包括&#…

2000-2022年全国各地级市绿色金融指数数据

2000-2022年全国各地级市绿色金融指数数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;来源&#xff1a;统计局、科技部、中国人民银行等权威机构网站及各种权威统计年鉴&#xff0c;包括全国及各省市统计年鉴、环境状况公报及一些专业统计年鉴&#xff0c;如 《中国…

ip转换器哪个好用 ip地址切换器有哪些

在互联网时代&#xff0c;IP转换器成为了实现高效工作的常见工具。而如今&#xff0c;市面上涌现出了众多的IP转换器软件&#xff0c;使得用户在选择时感到困惑。本文将介绍一种深度IP转换器软件&#xff0c;探讨其特点和优势&#xff0c;以及与其他软件相比的差异&#xff0c;…

DIP: NAS(Neural Architecture Search)论文阅读与总结(双份快乐)

文章地址: NAS-DIP: Learning Deep Image Prior with Neural Architecture SearchNeural Architecture Search for Deep Image Prior 参考博客:https://zhuanlan.zhihu.com/p/599390720 文章目录 NAS-DIP: Learning Deep Image Prior with Neural Architecture Search1. 方法…

2023 年牛客多校第七场题解

A Random Addition 题意&#xff1a;给定长度为 n n n 的数列&#xff0c;初始全为 0 0 0。对其中 m m m 个区间 [ l i , r i ] [l_i,r_i] [li​,ri​] 执行加 x x x 操作&#xff0c; x x x 等概率从 [ 0 , 1 ] [0,1] [0,1] 实数集合选取。这些区间包含或不相交。 q q …

PhotoShop学习笔记

PhotoShop学习笔记 对图像进行缩放拉伸自动选中像素相近的同一个区域分离图层的选中区域分离图层的非选中区域处理不自然的缝合痕迹 记录一些PhotoShop中用到的操作&#xff0c;主要是在处理AI图像时遇到的需求。 对图像进行缩放拉伸 CTRLT 自动选中像素相近的同一个区域 魔…

Easys Excel的表格导入(读)导出(写)-----java

一,EasyExcel官网: 可以学习一些新知识: EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 二,为什么要使用easyexcle excel的一些优点和缺点 java解析excel的框架有很多 &#xff1a; poi jxl,存在问题&#xff1a;非常的消耗内存&#xff0c; easyexcel 我们…