代码随想录算法训练营Day10 | 232.用栈实现队列、225. 用队列实现栈

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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

题目链接:232. 用栈实现队列

卡哥的视频链接:栈的基本操作! | LeetCode:232.用栈实现队列

  栈是一种仅支持在表尾进行插入和删除操作的线性表,这一端被称为栈顶,另一端被称为栈底。元素入栈指的是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;元素出栈指的是从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈中的元素遵守后进先出(LIFO)的原则.

  栈的底层有两种:分别是基于数组的顺序栈和基于链表的链式栈

解题思路:定义两个栈,一个入栈一个出栈,由于队列是先进先出的,要想通过栈实现,我们可以再定义一个栈,把输入栈的元素再通过输出栈重新输出,顺序就会和队列一模一样

代码示例:

import java.util.Stack;public class zhan_duilie {//声明两个栈private Stack <Integer>A;private Stack <Integer>B;//构造方法,用来初始化两个新栈public zhan_duilie() {A = new Stack<>();B = new Stack<>();}
//把x元素压入A栈中,A用于入栈,B用于出栈public void push(int x) {A.push(x);}public int pop() {int peek = peek(); // 调用peek()方法获取队头元素B.pop(); // 从B栈中弹出元素,模拟队列的出队操作return peek; // 返回队头元素的值}public int peek() {// 如果B栈不为空,直接返回B栈顶元素,即队头元素if (!B.isEmpty()) {return B.peek();}// 如果B栈为空,但A栈也为空,则队列为空,返回-1if (A.isEmpty()) {return -1;}// 如果B栈为空,但A栈不为空,则将A栈的所有元素依次弹出并压入B栈,直到A栈为空while (!A.isEmpty()) {B.push(A.pop());}// 返回B栈顶元素,即队头元素return B.peek();}public boolean empty() {// 如果A栈和B栈都为空,则队列为空return A.isEmpty() && B.isEmpty();}
}

代码逻辑详解:

  1. 初始化两个栈:

    在构造方法中,我们创建了两个栈,AB,用来模拟队列。

  2. 入队操作:

    当需要入队时,我们将元素压入栈A中。

  3. 出队操作:

    出队操作需要确保队列的先进先出原则。我们先检查栈B是否为空,如果不为空,直接从B栈中弹出元素;如果B栈为空,我们将栈A的元素依次弹出并压入B栈,然后再从B栈中弹出元素,确保了队列的先进先出顺序。

  4. 获取队头元素:

    我们首先检查栈B是否为空,如果不为空,直接返回B栈顶元素;如果B栈为空,我们将栈A的元素依次弹出并压入B栈,然后返回B栈顶元素,即为队头元素。

  5. 判断队列是否为空:

    我们只需检查两个栈是否都为空,若都为空则队列为空。

通过这些步骤,我们用两个栈实现了队列的基本功能,包括入队、出队、获取队头元素和判断队列是否为空。

leetcode提交记录:

小tips:

1.在队列中,出队操作应该返回队头元素,并将其从队列中移除。因此,在执行出队操作之前,我们需要先获取队头元素的值,以便在之后返回。否则,如果直接执行出队操作,我们就无法获取到出队的元素是什么,无法返回其值。

2.注意栈的定义和方法的具体使用

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", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多调用100 次 pushpoptop 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

题目链接:225. 用队列实现栈

卡哥的视频链接:队列的基本操作! | LeetCode:225. 用队列实现栈

题目思考:因为队列就像一个管道,怎么进去就怎么出来,所以我们要用两个队列,其中一个负责输出,一个负责储存,这样才能模拟实现栈的功能。

代码示例:

import java.util.LinkedList;
import java.util.Queue;public class duilie_zhan {// 声明两个队列作为栈的辅助数据结构Queue<Integer> queue1 = new LinkedList<>();Queue<Integer> queue2 = new LinkedList<>();// 构造方法,初始化两个队列public duilie_zhan() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();}// 入栈操作public void push(int x) {// 将新元素添加到队列2的末尾queue2.offer(x);// 将队列1的元素逐个出队并添加到队列2的末尾,确保新入栈的元素位于栈的顶部while (!queue1.isEmpty()) {queue2.offer(queue1.poll());}// 交换队列1和队列2,保持队列1始终为当前栈的主队列Queue<Integer> queueTemp;queueTemp = queue1;queue1 = queue2;queue2 = queueTemp;}// 获取栈顶元素public int top() {// 返回队列1的头部元素,即栈顶元素return queue1.peek();}// 判断栈是否为空public boolean empty() {// 如果队列1为空,则栈为空return queue1.isEmpty();}
}

代码逻辑详解:

  1. 入栈操作:

    • 当执行入栈操作时,首先将新元素加入到一个辅助队列中(这里是 queue2)。
    • 然后,我们需要确保新入栈的元素位于栈顶,因此将主队列(这里是 queue1)中的所有元素逐个出队,并依次加入到辅助队列的末尾。
    • 最后,为了保持栈的逻辑顺序,我们将主队列和辅助队列的引用进行交换,使得主队列成为当前栈的主队列。
  2. 获取栈顶元素:

    • 获取栈顶元素的操作是非常简单的,只需要返回主队列(这里是 queue1)的头部元素即可,因为头部元素即为栈顶元素。
  3. 判断栈是否为空:
    • 要判断栈是否为空,只需要检查主队列(queue1)是否为空即可。如果主队列为空,则表示栈为空。

总的来说,这段代码实现了使用两个队列来模拟栈的功能。在入栈操作中,我们使用了一个辅助队列来保持栈顺序的正确性,并且在需要时交换了主队列和辅助队列的引用。通过这种方式,我们可以利用队列的先进先出特性来模拟栈的后进先出行为。

leetcode提交记录:

小tips:

1.因为queue1是主队列,存储的全部的元素,所以取顶部元素、弹出元素和判断空都只需要对queue1进行操作

2.在对queue2进行添加新元素,把queue1的元素放入queue2中后,为了保证逻辑正确,我们要交换两个队列

3.注意队列的定义,没有圆括号,尖括号中要表明数据类型

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

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

相关文章

【leetcode面试经典150题】75. 二叉树展开为链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

修改Docker容器内文件的三种方式

说明&#xff1a;本文介绍修改Docker容器内文件的三种方式 方式一&#xff1a;直接修改 敲下面的命令&#xff0c;进入Docker容器&#xff0c;如mysql docker exec -it mysql /bin/bash修改mysql的配置文件&#xff0c;/etc/my.cnf vim /etc/my.cnf如下&#xff0c;如果vim…

【Hadoop】-Apache Hive使用语法与概念原理[15]

一、数据库操作 创建数据库 create database if not exists myhive; 使用数据库 use myhive; 查看数据库详细信息 desc database myhive; 数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 创建数据库并指定hdfs…

attempt to compare nil with number -- 黑马点评出现问题

问题情况 : 主要问题 : 调用lua执行redis时&#xff0c;有一个值会接受nil&#xff08;因为redis中没有该数据&#xff09;或者数值&#xff0c;当该值为nil时执行报错&#xff0c;因为会用到将该值与其他数字比较&#xff0c;故报错attempt to compare nil with number 当然…

生成完美口型同步的 AI 代言人视频(及其实现原理详解)

目录 什么是Heygen? Heygen注册 Video Translation&#xff08;视频翻译 完美口型同步&#xff09; 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具&#xff0c;可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…

关于springboot内置tomcat最大请求数配置的一些问题

前言 springboot内置了tomcat。那么一个springboot web应用&#xff0c;最大的请求链接数是多少呢&#xff1f;很早以前就知道这个是有个配置&#xff0c;需要的时候&#xff0c;百度一下即可。但&#xff0c;事实并非如此&#xff0c;有几个问题我想大多数人还真不知道。比如…

前端学习<四>JavaScript——54-原型链

常见概念 构造函数 构造函数-扩展 原型规则和示例 原型链 instanceof 构造函数 任何一个函数都可以被 new&#xff0c;new 了之后&#xff0c;就成了构造方法。 如下&#xff1a; function Foo(name, age) {this.name name;this.age age;//retrun this; //默认有这…

大型语言模型高效推理综述

论文地址&#xff1a;2404.14294.pdf (arxiv.org) 大型语言模型&#xff08;LLMs&#xff09;由于在各种任务中的卓越表现而受到广泛关注。然而&#xff0c;LLM推理的大量计算和内存需求给资源受限的部署场景带来了挑战。该领域的努力已经朝着开发旨在提高LLM推理效率的技术方…

C语言递归刷题(一)

目录 走台阶题目思路代码 西格玛题目思路代码 用函数实现数的阶乘题目思路代码 digit题目思路代码 Hermite多项式题目思路代码 排列数题目思路代码 逆序输出题目思路代码 结语 走台阶 题目 描述 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选…

挑战特斯拉?深蓝汽车与华为强强联手

作为中国乃至全球汽车行业的盛宴&#xff0c;4月25日在中国国家展览中心揭幕的2024北京国际车展&#xff0c;吸引了无数企业行业人士的关注。 而就在车展开幕当天&#xff0c;深蓝汽车发布会就爆出了一个大新闻&#xff1a;深蓝汽车将携手华为&#xff0c;打造比特斯拉更好的智…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

FPGA 以太网通信UDP通信环回

1 实验任务 上位机通过网口调试助手发送数据给 FPGA &#xff0c; FPGA 通过 PL 端以太网接口接收数据并将接收到的数据发送给上位机&#xff0c;完成以太网 UDP 数据的环回。 2 系统设计 系统时钟经过PLL时钟模块后&#xff0c;生成了两种不同频率和相位的时钟信号&#…

Python 面向对象——6.封装

本章学习链接如下&#xff1a; Python 面向对象——1.基本概念 Python 面向对象——2.类与对象实例属性补充解释&#xff0c;self的作用等 Python 面向对象——3.实例方法&#xff0c;类方法与静态方法 Python 面向对象——4.继承 Python 面向对象——5.多态 1. 封装的基…

unity cinemachine相机 (案例 跟随角色移动)

安装相机包 打开包管理工具 在 unity registry 搜索cinemachine 会在maincamera中生成一个组件cinemachineBrain 只能通过虚拟相机操控 主相机 虚拟相机的参数 案例 1.固定相机效果 位置 在固定的地方 默认的模式 2.相机跟随人物效果 焦距设置 20 跟随设置 把playere…

使用Tortoise 创建远程分支

1。首先创建本地分支branch1&#xff0c;右键tortoise git->创建分支&#xff0c;输入分支名称branch1&#xff0c;确定。 2。右键tortoise git->推送&#xff0c;按下图设置&#xff0c;确定&#xff0c;git会判断远程有没有分支branch1&#xff0c;如果没有会自动创建…

重看Spring聚焦Environment分析

目录 一、理解Environment的设计 &#xff08;一&#xff09;整体理解 &#xff08;二&#xff09;聚焦Profiles分析 &#xff08;三&#xff09;聚焦Properties分析 二、Environment类图结构分析 三、PropertyResolver源码分析 &#xff08;一&#xff09;源码展示说明…

C语言学习/复习36

一、程序的环境与预处理 二、翻译环境与执行环境 三、运行环境 四、预编译(预处理)详解

mac电脑搭建vue环境(上篇)

第一步&#xff1a;mac电脑要有homebrew&#xff0c;如何安装homebrew 点击下方 MAC安装homebrew-CSDN博客 第二步&#xff1a;homebrew安装node.js 第三步&#xff1a;安装npm 第四步&#xff1a;安装webpack 第五步&#xff1a;安装vue脚手架 第六步&#xff1a;可以在…

NumPy 1.26 中文官方指南(一)

NumPy 用户指南 原文&#xff1a;numpy.org/doc/1.26/user/index.html 本指南是一个概述&#xff0c;解释了重要特性&#xff1b;细节请参阅 NumPy 参考文档。 入门指南 什么是 NumPy? 安装 NumPy 快速入门 NumPy&#xff1a;初学者的绝对基础 基础知识和用法 NumPy 基础…

工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单数据集(2017-2022年)

01、数据简介 工信部致力于推动制造业的绿色转型&#xff0c;为了表彰在绿色制造领域取得显著成绩的企业和园区&#xff0c;工信部发布了绿色工厂公示名单、绿色设计产品公示名单、绿色供应链企业公示名单和绿色园区公示名单。 这些企业和园区在绿色制造方面做出了卓越的贡献…