代码随想录算法训练营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栈也为空,则队列为空,返回-1
        if (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.mfbz.cn/a/578730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git的操作和使用

一、基本操作 1、创建git本地仓库 &#xff08;1&#xff09;创建目录&#xff1a;mkdir gitcode &#xff08;2&#xff09;进入目录&#xff1a;cd gitcode/ &#xff08;3&#xff09;查询目录内容&#xff1a;ls &#xff08;4&#xff09;在当前目录下创建git本地仓库…

数据结构(七)---二叉树

目录 一.树的基本概念 二.树的性质 三.二叉树 1.二叉树的基本概念 2.特殊的二叉树 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉排序树 &#xff08;4&#xff09;平衡二叉树 3.二叉树的性质 4.完全二叉树…

CC软件防火墙和WEB应用防火墙哪个好

本文将从CC软件防火墙的定义、原理、功能以及应用方面进行全面探讨&#xff0c;旨在加深对CC软件防火墙的理解&#xff0c;并推动网络安全意识的普及。以及WEB应用防火墙二者之间的对比。让用户更了解两个形态产品并作出选择。 第一部分&#xff1a;CC软件防火墙的定义和原理 …

北京小米智能工厂

小米工厂智能化 小米集团昌平区的小米智能工厂二期&#xff0c;成为引领智能化制造的重要一环。这座工厂计划打造成为京津冀地区智能制造示范工厂和全球级的“灯塔工厂”。 工厂位于小米未来产业园区&#xff0c;占地81000平方米&#xff0c;年产能可达千万台智能手机&#xff…

创新指南 | 2024年企业如何十步打造最佳的数字化营销策略组合

营销是一个动态且不断变化的领域。顶级的数字营销策略随着消费者和技术趋势的变化而变化。这就是为什么每个公司都需要一个经过良好规划并具有明确里程碑和目标的营销策略。一旦你有了正确的计划&#xff0c;你实现为业务设定的目标的可能性就会大大增加。这意味着&#xff0c;…

提交链码-编辑前后端,调用链码功能

一 . 链码介绍 1.什么链码&#xff1f; • 链码是一段用 Go、Node.js 或者 Java 实现了规定接口的程序。链码在安全的Docker容器中运行&#xff0c; 与背书节点的进程隔离。通过应用程序提交的交易&#xff0c;链码初始化和管理账本状态。• 链码通常处理网络成员协商达成的业…

全网都在找的python+requests接口自动化测试框架实例详解教程

前言 Python是一种功能强大的编程语言&#xff0c;它可以用于自动化测试&#xff0c;特别是接口自动化测试。许多Python库都可以用于接口自动化测试&#xff0c;其中requests库是其中最受欢迎的库之一。 requests库可以用于发送HTTP请求并获取服务器响应&#xff0c;从而轻松…

spring常用注解(五)lombok库

一、介绍&#xff1a; 1、简介&#xff1a; Lombok是一个作用于编辑器和构建工具的 Java 库&#xff0c;可以对编写的 Java 代码进行增强&#xff0c;比如说不用再写实体类的 getter 方法&#xff0c;equals 方法而是自动生成&#xff0c;自动生成日志输出变量等等&#xff0…

uniapp 之 开发微信小程序入门详细指南

目录 配置运行设置&#xff08;编辑器的设置&#xff09;项目目录文件配置基础配置中的uniapp应用标识&#xff08;AppID&#xff09;配置微信小程序的AppID 总结 配置运行设置&#xff08;编辑器的设置&#xff09; 点击编辑器上方菜单栏 - 运行 - 运行到小程序模拟器 - 运行…

css利用transform:skew()属性画一个大屏的背景斜面四边形特效

在工作工程中需要写一个如下的大屏背景&#xff0c;是由几个斜面做成的效果 使用css transform function中的skew()方法实现画其中一个斜面&#xff0c;然后调整背景色实现 写一个div <div class"skew_container test-2"><div class"skew_container_it…

【Linux进程】守护进程

【Linux进程】守护进程 目录 【Linux进程】守护进程守护进程守护进程概念进程组和会话的概念 系统的守护进程函数 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.4.27 前言&#xff1a;本篇博客将会介绍守护进程&#xff0c;以及进程组和会话的概念&#xff0c;如何变成…

【信息收集】WAF防火墙识别工具Wafw00f

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、了解WAF防火墙 Web应用防护系统&#xff08;也称为&…

【Pytorch】(十三)模型部署: TorchScript

文章目录 &#xff08;十三&#xff09;模型部署: TorchScriptPytorch动态图的优缺点TorchScriptPytorch模型转换为TorchScripttorch.jit.tracetorch.jit.scripttrace和script的区别总结trace 和script 混合使用保存和加载模型 &#xff08;十三&#xff09;模型部署: TorchScr…

基于java+springboot+vue实现的医疗挂号管理系统(文末源码+Lw)203

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医疗挂号信息管理的提升&#x…

Pytorch 之torch.nn初探 卷积--Convolution Layers

任务描述 本关任务&#xff1a; 本关提供了一个Variable 类型的变量input&#xff0c;按照要求创建一 Conv1d变量conv&#xff0c;对input应用卷积操作并赋值给变量 output&#xff0c;并输出output 的大小。 相关知识 卷积的本质就是用卷积核的参数来提取原始数据的特征&a…

OpenHarmony语言基础类库【@ohos.util.Stack (线性容器Stack)】

ohos.util.Stack (线性容器Stack) Stack基于数组的数据结构实现&#xff0c;特点是先进后出&#xff0c;只能在一端进行数据的插入和删除。 Stack和[Queue]相比&#xff0c;Queue基于循环队列实现&#xff0c;只能在一端删除&#xff0c;另一端插入&#xff0c;而Stack都在一…

[Qt的学习日常]--信号和槽

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xff…

PyQt6 优化操作:建立侧边栏,要求可拖拽改变宽度,可用按钮控制侧边栏的展开和收起

1. 官方文档 QSplitter — PyQt Documentation v6.6.0 2. 效果展示 可拖拽改变宽度比例 点击按钮快速收起或展开侧边栏 点击按钮&#xff0c;侧边栏收起&#xff0c;同时按钮图标变为向左箭头 (对应展开功能)&#xff0c;再次点击按钮&#xff0c;侧边栏展开&#xff0c;同…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色&#xff0c;他们的发展推动了自动化和智能化水平的提高&#xff0c;有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…
最新文章