LeetCode刷题:栈和队列的相关题目

news/2024/12/12 6:36:08/

  • 前言
  • 1.用栈来实现队列
    • 1.1思路
    • 1.2图示
    • 1.3代码
  • 2.用队列来实现栈
    • 2.2思路
    • 2.2代码
  • 3.最小栈
    • 3.1思路
    • 3.2图示
    • 3.3代码
  • 4.删除字符串中所有相邻重复项
    • 4.1思路
    • 4.2代码

前言

大家如果对于队列的性质等不太了解的话,我推荐一篇博客,写得很细节,大家可以去看看栈 和 队列 【 Stack And Queue】- java - 细节决定一切

1.用栈来实现队列

在这里插入图片描述
在这里插入图片描述
我们要注意一个点,栈是先进后出,队列是先进先出,用一个栈是很难实现队列的,我们可以让一个栈用来入队列,另外一个栈来出队列

1.1思路

入队:先把所有元素放到栈A中(栈B用来出队)
出队:先把栈A中的所有元素出栈进入到栈B中,然后栈B的栈顶元素就是要出队的元素
取队首元素:和出队操作类似,先把A元素进入到B,取栈B的栈顶元素
判断是否为空:看A和B是否同时为空

1.2图示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3代码

class MyQueue {private Stack<Integer> stackIn;private Stack<Integer> stackOut;public MyQueue() {stackIn=new Stack();stackOut=new Stack();}//入队public void push(int x) {if(stackOut.isEmpty()){stackIn.push(x);}else{while(!stackOut.isEmpty()){stackIn.push(stackOut.pop());}stackIn.push(x);}}public int pop() {while(!stackIn.isEmpty()){stackOut.push( stackIn.pop());}return stackOut.pop();}public int peek() {while(!stackIn.isEmpty()){stackOut.push( stackIn.pop());}return stackOut.peek();}public boolean empty() {return stackIn.isEmpty() && stackOut.isEmpty();}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

2.用队列来实现栈

用队列实现栈

  • 仅仅使用两个队列实现栈的四种操作(push,pop,tip,empty)
  • 我们只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。

2.2思路

一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。

2.2代码

class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<Integer>();queue2 = new LinkedList<Integer>();}public void push(int x) {queue2.offer(x);while (!queue1.isEmpty()) {queue2.offer(queue1.poll());}Queue<Integer> temp = queue1;queue1 = queue2;queue2 = temp;}public int pop() {return queue1.poll();}public int top() {return queue1.peek();}public boolean empty() {return queue1.isEmpty();}
}

3.最小栈

题目链接最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

3.1思路

  • 因为要求在常数时间内检索到最小元素,所以用一个栈是无法达到的,因为需要O(n)
  • 我们可以用一个辅助栈B来存放栈的最小元素,那么直接取出辅助栈的栈顶元素就是栈的最小元素
  • 入栈的话,A直接入栈,B如果为空,则直接入栈,B如果不是空,则比较B的栈顶和A的大小关系,如果待入栈元素比B栈顶元素小,则入B
  • 取栈顶:直接取A栈顶
  • 取最小元素:直接取B栈顶元素

3.2图示

下面的流程图来自博主独一无二的哈密瓜
在这里插入图片描述
在这里插入图片描述

3.3代码

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.isEmpty()){minStack.push(val);}else{if(val<=minStack.peek()){minStack.push(val);}}}public void pop() {if(!stack.isEmpty()){int val=stack.pop();if(val==minStack.peek()){minStack.pop();}}}public int top() {return stack.peek();}public int getMin() {return minStack.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();*/

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

删除字符串中所有相邻重复项
在这里插入图片描述

4.1思路

  • 我们可以使用栈来完成
  • 当栈为空,则把字符直接加入栈中
  • 如果栈非空
    • 若栈顶元素和待加入元素相等,则栈顶元素出栈
    • 若栈顶元素和待加入元素不相等,则该元素入栈
  • 最后把栈中所有元素出栈,然后反转就是结果,为了简单一点,我们可以使用ArrayDeque双端队列

4.2代码

class Solution {public String removeDuplicates(String S) {//ArrayDeque会比LinkedList在除了删除元素这一点外会快ArrayDeque<Character> deque = new ArrayDeque<>();char ch;for (int i = 0; i < S.length(); i++) {ch = S.charAt(i);if (deque.isEmpty() || deque.peek() != ch) {deque.push(ch);} else {deque.pop();}}String str = "";//剩余的元素即为不重复的元素while (!deque.isEmpty()) {str = deque.pop() + str;}return str;}
}

http://www.ppmy.cn/news/606258.html

相关文章

LeetCode简单题之机器人能否返回原点

题目 在二维平面上&#xff0c;有一个机器人从原点 (0, 0) 开始。给出它的移动顺序&#xff0c;判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R&#xff08;右&#xff09;&#xff0c;L&…

谷歌BERT预训练源码解析(三):训练过程

目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程&#xff0c;BERT模型训练过程是在自己的TPU上进行的&#xff0c;这部分我没做过研究所以不做深入探讨。BERT针对两个任务同时训练。1.下一句预测。2.遮蔽词识别 下面介绍…

【解决方法】Python嵌套list如何换行

需求 输出一个excel&#xff0c;其中有一个单元格的数据要换行。 问题 list中间加‘\n’不会换行&#xff0c;会直接显示‘\n’字符。 解决方法 记住一个原则&#xff0c;str中的’\n’是能换行的。 想办法把list转为str即可。 示例 原代码 import pandas as pdout_lis…

《attention is all you need》解读

Motivation: 靠attention机制&#xff0c;不使用rnn和cnn&#xff0c;并行度高通过attention&#xff0c;抓长距离依赖关系比rnn强创新点&#xff1a; 通过self-attention&#xff0c;自己和自己做attention&#xff0c;使得每个词都有全局的语义信息&#xff08;长依赖由于 Se…

LeetCode简单题之句子中的有效单词数

题目 句子仅由小写字母&#xff08;‘a’ 到 ‘z’&#xff09;、数字&#xff08;‘0’ 到 ‘9’&#xff09;、连字符&#xff08;’-’&#xff09;、标点符号&#xff08;’!’、’.’ 和 ‘,’&#xff09;以及空格&#xff08;’ &#xff09;组成。每个句子可以根据空格…

LeetCode简单题之比特位计数

题目 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --&…

AMD与Intel,挑战英伟达GPU

AMD与Intel&#xff0c;挑战英伟达GPU 作为CPU界的霸主&#xff0c;英特尔对高性能GPU市场一直没有死心。从1998年和Real3D合作推出的i740独显&#xff0c;到2009年无故流产的Larrabee独显&#xff0c;再到去年公布的Xe GPU架构。任谁来都能看出&#xff0c;英特尔进军独立显卡…

LeetCode简单题之汉明距离

题目 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的…