【数据结构-队列】力扣232. 用栈实现队列

devtools/2024/11/28 2:39:52/

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

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

说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:
输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

提示:
1 <= x <= 9
最多调用 100 次 push、pop、peek 和 empty
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

双栈模拟

class MyQueue {
public:stack<int> st1;stack<int> st2;MyQueue() {}void push(int x) {st1.push(x);}int pop() {while(!st1.empty()){st2.push(st1.top());st1.pop();}int r = st2.top();st2.pop();while(!st2.empty()){st1.push(st2.top());st2.pop();}return r;}int peek() {while(!st1.empty()){st2.push(st1.top());st1.pop();}int r = st2.top();while(!st2.empty()){st1.push(st2.top());st2.pop();}return r;}bool empty() {return st1.empty();}
};

在上一题用队列模拟栈中,我们在push中进行相对复杂的操作来使得队列中的元素排列顺序和栈类似,然后我们将队列的头看成栈顶来进行pop。而在这一题栈模拟队列中,如果使用那种做法会发现我们没办法将栈元素的排列顺序和队列类似,所以我们就只需要按栈的顺序来排列元素,然后我们在pop的时候,将栈底的元素弹出就行。那么要将栈底的元素弹出,我们就需要另外一个栈st2来辅助,我们将栈st1的元素全部推入st2中,然后st1的栈底元素就在st2的栈顶,将st2栈顶的元素pop并返回后,再将st2的元素推入st1中,这时候就可以实现st1栈底元素被pop掉。


http://www.ppmy.cn/devtools/137553.html

相关文章

vueuse中的useTemplateRefsList

在 v-for 中绑定 ref 到模板元素和组件的简写方式 Demo1 <script setup lang"ts"> import { onUpdated } from vue import { useTemplateRefsList } from vueuse/coreconst refs useTemplateRefsList<HTMLDivElement>()onUpdated(() > {console.lo…

微信小程序常用全局配置项及窗口组成部分详解

微信小程序常用全局配置项及窗口组成部分详解 引言 微信小程序作为一种新兴的应用形态,凭借其轻量级、便捷性和丰富的功能,已成为开发者和用户的热门选择。在开发小程序的过程中,了解全局配置项和窗口组成部分是至关重要的。本文将详细介绍微信小程序的常用全局配置项及窗…

YonBuilder移动开发鸿蒙版本编译教程

0.YonBuilder移动开发应用详情页访问路径 登录用友开发者中心&#xff0c;鼠标悬浮右上角昵称处&#xff0c;点击「工作台」进入「开发者中心工作台」 「开发者中心工作台」页面点击左侧竖直菜单面板中「移动应用开发」后&#xff0c;选择右侧页面内的目标应用&#xff0c;即可…

PYTORCH基础语法知识

初识Torch PyTorch&#xff0c;简称Torch&#xff0c;主流的经典的深度学习框架&#xff0c;深度学习的框架。 简介 PyTorch是一个基于Python的深度学习框架&#xff0c;它提供了一种灵活、高效、易于学习的方式来实现深度学习模型。PyTorch最初由Facebook开发&#xff0c;被…

241124_基于MindSpore学习Prompt Tuning

241124_基于MindSpore学习Prompt Tuning 传统的NLP训练模式都是先在大量的无标注的样本上进行预训练&#xff0c;然后再使用有标注的样本进行有监督的训练&#xff0c;调整单一的线性成果而不是整个模型。 但在实际训练中发现&#xff0c;如果模型参数过大&#xff0c;在Fine…

[chrome]黑色界面插件,PDF合并插件

Dark Reader_chrome插件下载,最新浏览器扩展,crx离线安装包 - 插件小屋 合并 PDF_chrome插件下载,最新浏览器扩展,crx离线安装包 - 插件小屋 下载的zip包解压成crx&#xff0c;然后把后缀名改为rar&#xff0c;然后解压&#xff0c;再导入解压的目录。

KVM虚拟机迁移常见错误

1. [rootlocalhost virsh-test]# virsh migrate test --live --verbose --copy-storage-all qemutcp://192.168.10.3/system error: internal error: hostname on destination resolved to localhost, but migration requires an FQDN 错误&#xff1a;内部错误&#xff1a;目…

Android中的依赖注入(DI)框架Hilt

Hilt 是 Android 提供的一种依赖注入&#xff08;DI&#xff09;框架&#xff0c;它基于 Dagger&#xff0c;目的是简化依赖注入的使用&#xff0c;提供更易用的接口和与 Android 生命周期组件的紧密集成。下面是 Hilt 的详细介绍。 为什么选择 Hilt? 依赖注入的优势&#xf…