Leetcode 题解 - 栈和队列

news/2025/4/2 12:41:40/文章来源:https://www.cnblogs.com/sun227454/p/18803234

Leetcode 题解 - 栈和队列

  • Leetcode 题解 - 栈和队列
    • 1. 用栈实现队列
    • 2. 用队列实现栈
    • 3. 最小值栈
    • 4. 用栈实现括号匹配
    • 5. 数组中元素与下一个比它大的元素之间的距离
    • 6. 循环数组中比当前元素大的下一个元素

1. 用栈实现队列

232. Implement Queue using Stacks (Easy)

Leetcode / 力扣

栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。

class MyQueue {private Stack<Integer> in = new Stack<>();private Stack<Integer> out = new Stack<>();public void push(int x) {in.push(x);}public int pop() {in2out();return out.pop();}public int peek() {in2out();return out.peek();}private void in2out() {if (out.isEmpty()) {while (!in.isEmpty()) {out.push(in.pop());}}}public boolean empty() {return in.isEmpty() && out.isEmpty();}
}

2. 用队列实现栈

225. Implement Stack using Queues (Easy)

Leetcode / 力扣

在将一个元素 x 插入队列时,为了维护原来的后进先出顺序,需要让 x 插入队列首部。而队列的默认插入顺序是队列尾部,因此在将 x 插入队列尾部之后,需要让除了 x 之外的所有元素出队列,再入队列。

class MyStack {private Queue<Integer> queue;public MyStack() {queue = new LinkedList<>();}public void push(int x) {queue.add(x);int cnt = queue.size();while (cnt-- > 1) {queue.add(queue.poll());}}public int pop() {return queue.remove();}public int top() {return queue.peek();}public boolean empty() {return queue.isEmpty();}
}

3. 最小值栈

155. Min Stack (Easy)

Leetcode / 力扣

class MinStack {private Stack<Integer> dataStack;private Stack<Integer> minStack;private int min;public MinStack() {dataStack = new Stack<>();minStack = new Stack<>();min = Integer.MAX_VALUE;}public void push(int x) {dataStack.add(x);min = Math.min(min, x);minStack.add(min);}public void pop() {dataStack.pop();minStack.pop();min = minStack.isEmpty() ? Integer.MAX_VALUE : minStack.peek();}public int top() {return dataStack.peek();}public int getMin() {return minStack.peek();}
}

对于实现最小值队列问题,可以先将队列使用栈来实现,然后就将问题转换为最小值栈,这个问题出现在 编程之美:3.7。

4. 用栈实现括号匹配

20. Valid Parentheses (Easy)

Leetcode / 力扣

"()[]{}"Output : true
public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(' || c == '{' || c == '[') {stack.push(c);} else {if (stack.isEmpty()) {return false;}char cStack = stack.pop();boolean b1 = c == ')' && cStack != '(';boolean b2 = c == ']' && cStack != '[';boolean b3 = c == '}' && cStack != '{';if (b1 || b2 || b3) {return false;}}}return stack.isEmpty();
}

5. 数组中元素与下一个比它大的元素之间的距离

739. Daily Temperatures (Medium)

Leetcode / 力扣

Input: [73, 74, 75, 71, 69, 72, 76, 73]
Output: [1, 1, 4, 2, 1, 1, 0, 0]

在遍历数组时用栈把数组中的数存起来,如果当前遍历的数比栈顶元素来的大,说明栈顶元素的下一个比它大的数就是当前元素。

public int[] dailyTemperatures(int[] temperatures) {int n = temperatures.length;int[] dist = new int[n];Stack<Integer> indexs = new Stack<>();for (int curIndex = 0; curIndex < n; curIndex++) {while (!indexs.isEmpty() && temperatures[curIndex] > temperatures[indexs.peek()]) {int preIndex = indexs.pop();dist[preIndex] = curIndex - preIndex;}indexs.add(curIndex);}return dist;
}

6. 循环数组中比当前元素大的下一个元素

503. Next Greater Element II (Medium)

Leetcode / 力扣

Input: [1,2,1]
Output: [2,-1,2]
Explanation: The first 1's next greater number is 2;
The number 2 can't find next greater number;
The second 1's next greater number needs to search circularly, which is also 2.

与 739. Daily Temperatures (Medium) 不同的是,数组是循环数组,并且最后要求的不是距离而是下一个元素。

public int[] nextGreaterElements(int[] nums) {int n = nums.length;int[] next = new int[n];Arrays.fill(next, -1);Stack<Integer> pre = new Stack<>();for (int i = 0; i < n * 2; i++) {int num = nums[i % n];while (!pre.isEmpty() && nums[pre.peek()] < num) {next[pre.pop()] = num;}if (i < n){pre.push(i);}}return next;
}

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

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

相关文章

第5章 编写异步代码

第5章 编写异步代码 5.1 异步函数简介 C# 5 引入了异步函数的概念。异步函数可以指某个由 async 修饰符修饰的方法或者匿名函数,它可以对 await 表达式使用 await 运算符。 5.2 对异步模式的思考 5.2.1 关于异步执行本质的思考 await 在 C#中的任务本质上是请求编译器为我们创…

Spring Cloud Gateway 与 Knife4j 集成实践

注意:写于 2025/1/10,未来时间可能失效,请根据具体情况实践。在微服务架构中,Gateway 通常承担着路由转发、负载均衡、鉴权等职责,而 Knife4j 是一个集 Swagger2 和 OpenAPI3 为一体的增强解决方案,可以帮助开发者快速聚合使用OpenAPI 规范。 本文参考 Knife4j 文档,进行…

用户说:10分钟用通义灵码搞定“今天穿什么”!打开爽文世界……

当我仅用10分钟调教出一个会关心我穿不穿秋裤的管家时,突然想到,现在限制我们开发的已经不是编程能力,而在于你有没有把你的想象力塞进代码框!作者:ZLJ,浙江大学教育技术学研究生 当我仅用10分钟调教出一个会关心我穿不穿秋裤的管家时,突然想到,现在限制我们开发的已经…

Cyber Apocalypse 2025 forensics WP

Cyber Apocalypse 2025 forensics WPCyber Apocalypse 2025 WP 做了国际赛之后虽然(目前只做了两道,可是没环境了啊,前几天比赛有点多~www),只从取证这边说,感觉他们的题很有趣,情境也给的很真实连贯,出题灵活,就是能见到很多新兴的知识,拓展知识面,以后会多看一看…

python第六周作业(第四章课后程序练习题)

4.1 import random def guess_number(): target = random.randint(1, 100) count = 0 while True:guess = int(input("请输入你猜的数字(1-100): "))count += 1if guess < target:print("猜小了")elif guess > target:print("猜大了")else…

win安装oracle19c没有listener

然后就可以看到启动了本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18803159

《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》

章节 6:日期选择器与日期处理目标学习如何使用DatePicker组件。 理解日期格式化和日期计算。内容日期选择器基础使用DatePicker组件。 处理日期选择事件。日期格式化格式化日期为友好的文本。日期计算判断日期是否过期或即将到期。代码示例 @Entry @Component struct DatePick…

MarkDwon语法

MarkDown语法 1、标题用法 一级标题:#+空格+内容+回车 二级标题:##+空格+内容+回车 三级标题:###+空格+内容+回车 四级标题:####+空格+内容+回车 2、字体用法 粗体使用:快捷键ctrl+b或者内容两边加两个星号,示例 斜体使用:内容两边加一个星号,示例 斜体加粗:内容两边加…

图论(连通分量)

AT_abc284_c [ABC284C] Count Connected Components 题目描述 頂点に $ 1 $ から $ N $ の番号が、辺に $ 1 $ から $ M $ の番号がついた $ N $ 頂点 $ M $ 辺の単純無向グラフが与えられます。辺 $ i $ は頂点 $ u_i $ と頂点 $ v_i $ を結んでいます。 グラフに含まれる連結…

业务系统基础框架-Winform版-角色

角色列表,可刷新,可展开,可折叠编辑角色为角色权限为角色分配菜单查看拥有此角色的账号

3.31 学习记录

实现了使用springboot从文件中读取数据显示在前端

记一次GC导致线上服务超时问题

1、现象2024-12-28 23点左右,线上其他服务请求 content-cache 出现批量超时。content-cache-03 机器内存使用率如下:机器配置:4核8G这里因为JVM参数设置为:-Xms4g -Xmx4g -XX:MaxNewSize=1g所以达到42%时,内存的使用率已经达到了3.3G。 2、数据查看GC日志如下: (1)CMS老…