算法13(力扣225)-用队列实现栈

news2025/2/8 11:09:32

1、问题

        请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

            实现 MyStack 类:

            void push(int x) 将元素 x 压入栈顶。

            int pop() 移除并返回栈顶元素。

            int top() 返回栈顶元素。

            boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

2、示例

        输入:["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

3、实现思路

(1)理解题意

(2)实现思路,按照正常的数组来即可,但是需要记住队和栈的特点

4、具体步骤

(1)创建栈:定义两个队列,其中一个用来处理插入、判空,另一个用来处理返回栈顶元素操作、弹出栈顶元素的操作

(2)push操作:插入,给queue1使用push插入即可

(3)pop弹出操作:栈是先进后出,队是先进先出,将队1的第一个弹出作为队2的输入,然后队2就是队1的逆序(队1剩的最后一个元素就是栈顶元素,即需要删除的元素),然后将剩余元素按照相同的方法返回队1

(4)top返回栈顶元素:和pop相似,只是不删除栈顶元素,使用临时变量存储,然后将队1剩余的元素压入队2,然后将队2所有的元素返回给队1

(5)empty判断栈是否为空(判断队1的长度即可)

5、完整代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>用队列实现栈</title>
  </head>
  <body>
    <p>
        请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

        <p>
            <h4>
                实现 MyStack 类:
            </h4>
            void push(int x) 将元素 x 压入栈顶。<br>
            int pop() 移除并返回栈顶元素。<br>
            int top() 返回栈顶元素。<br>
            boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
        </p>
 
    </p>
    <p>
        输入:["MyStack", "push", "push", "top", "pop", "empty"]
        [[], [1], [2], [], [], []]<br>
        输出:[null, null, null, 2, 2, false]
        <p>
            解释:<br>
            MyStack myStack = new MyStack();<br>
            myStack.push(1);<br>
            myStack.push(2);<br>
            myStack.top(); // 返回 2<br>
            myStack.pop(); // 返回 2<br>
            myStack.empty(); // 返回 False<br>
        </p>
    </p>
    <script> 
    // 创建栈
        var MyStack = function() {
            this.queue1=[]
            this.queue2=[]   
        };

        /** 
         * @param {number} x
         * @return {void}
         */
        // 给栈中添加元素
        MyStack.prototype.push = function(x) {
            this.queue1.push(x)
        };

        /**
         * @return {number}
         */
        // 弹出(栈顶元素)(队1的最后一个元素)
        MyStack.prototype.pop = function() {
            // 栈是先进后出,队是先进先出,将队1的第一个弹出作为队2的输入,然后队2就是队1的逆序(队1剩的最后一个元素就是栈顶元素,即需要删除的元素),然后将剩余元素按照相同的方法返回队1
            let topElement;
            while (this.queue1.length > 1) {
                this.queue2.push(this.queue1.shift())
            }
            topElement = this.queue1.shift()
            while (this.queue2.length) {
                this.queue1.push(this.queue2.shift());
            }
            return topElement;
        };

        /**
         * @return {number}
         */
        // 返回栈顶元素
        MyStack.prototype.top = function() {
            // 和pop相似,只是不删除栈顶元素,使用临时变量存储,然后将队1剩余的元素压入队2,然后将队2所有的元素返回给队1
            let topElement;
             while (this.queue1.length > 1) {
                this.queue2.push(this.queue1.shift())
            }
            topElement = this.queue1[0]
            this.queue2.push(this.queue1.shift())
            while (this.queue2.length > 0) {
                this.queue1.push(this.queue2.shift());
            }
            return topElement;
        };

        /**
         * @return {boolean}
         */
        // 判断栈是否为空(判断队1的长度即可)
        MyStack.prototype.empty = function() {
            return !this.queue1.length;
        };

        var myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        console.log(myStack.top()); // Output: 2
        console.log(myStack.pop()); // Output: 2
        console.log(myStack.empty()); // Output: false
        /** 
         * Your MyStack object will be instantiated and called as such:
         * var obj = new MyStack()
         * obj.push(x)
         * var param_2 = obj.pop()
         * var param_3 = obj.top()
         * var param_4 = obj.empty()
         */
    </script>
  </body>
</html>

6、力扣通过代码

   // 创建栈
        var MyStack = function() {
            this.queue1=[]
            this.queue2=[]   
        };

        /** 
         * @param {number} x
         * @return {void}
         */
        // 给栈中添加元素
        MyStack.prototype.push = function(x) {
            this.queue1.push(x)
        };

        /**
         * @return {number}
         */
        // 弹出
        MyStack.prototype.pop = function() {
            // 栈是先进后出,队是先进先出,将队1的第一个弹出作为队2的输入,然后队2就是队1的逆序(队的第一个元素就是栈顶元素,即需要删除的元素)
            let topElement;
            while (this.queue1.length > 1) {
                this.queue2.push(this.queue1.shift())
            }
            topElement = this.queue1.shift()
            while (this.queue2.length) {
                this.queue1.push(this.queue2.shift());
            }
            return topElement;
        };

        /**
         * @return {number}
         */
        // 返回栈顶元素
        MyStack.prototype.top = function() {
            let topElement;
             while (this.queue1.length > 1) {
                this.queue2.push(this.queue1.shift())
            }
            topElement = this.queue1[0]
            this.queue2.push(this.queue1.shift())
            while (this.queue2.length > 0) {
                this.queue1.push(this.queue2.shift());
            }
            return topElement;
        };

        /**
         * @return {boolean}
         */
        // 判断栈是否为空
        MyStack.prototype.empty = function() {
            return !this.queue1.length;
        };

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

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

相关文章

【Elasticsearch】文本分类聚合Categorize Text Aggregation

响应参数讲解: key &#xff08;字符串&#xff09;由 categorization_analyzer 提取的标记组成&#xff0c;这些标记是类别中所有输入字段值的共同部分。 doc_count &#xff08;整数&#xff09;与类别匹配的文档数量。 max_matching_length &#xff08;整数&#xff09;从…

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践&#xff0c;按重要程度分层说明&#xff1a; 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析&#xff1a; 是否需要排序&#xff1f;&#xff1a; zset&#xff08;有序集合&#xff09;用…

2025简约的打赏系统PHP网站源码

源码介绍 2025简约的打赏系统PHP网站源码 源码上传服务器&#xff0c;访问域名/install.php安装 支持自定义金额打赏 集成支付宝当面付 后台管理系统 订单记录查询 效果预览 源码获取 2025简约的打赏系统PHP网站源码

交叉编译工具链下载和使用

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码&#xff0c;发现登不上去 过滤掉了or&#xff0c;&#xff0c;当尝试了n种方法以后&#xff0c;最关键的是发现()居然也被过滤了 哈哈&#xff0c;那玩个淡&#xff0c; 再搜wp&#xff01;&#xff01; 当输入admin的时候&#xff0c;提示密码错误&#xff0…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

Rust语言进阶之标准输入: stdin用法实例(一百零五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

5G技术解析:从核心概念到关键技术

1. 引言 5G技术的迅猛发展正在重塑我们的生活方式和社会结构。它不仅仅是新一代的移动通信技术&#xff0c;更是一场深刻的技术革命。5G网络正在以其惊人的高速、低延迟和大带宽能力&#xff0c;为智能家居、自动驾驶、工业自动化、远程医疗等另一带来前所未有的可能性。 本文…

DeepSeek 引领的 AI 范式转变与存储架构的演进

近一段时间&#xff0c;生成式 AI 技术经历了飞速的进步&#xff0c;尤其是在强推理模型&#xff08;Reasoning-LLM&#xff09;的推动下&#xff0c;AI 从大模型训练到推理应用的范式发生了剧变。以 DeepSeek 等前沿 AI 模型为例&#xff0c;如今的 AI 技术发展已不局限于依赖…

基于Hexo实现一个静态的博客网站

原文首发&#xff1a;https://blog.liuzijian.com/post/8iu7g5e3r6y.html 目录 引言1.初始化Hexo2.整合主题Fluid3.部署评论系统Waline4.采用Nginx部署 引言 Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目&#xff0c;旨在提供一个简单、快速且易于扩展的静态博客生…

DeepSeek-R1 云环境搭建部署流程

DeepSeek横空出世&#xff0c;在国际AI圈备受关注&#xff0c;作为个人开发者&#xff0c;AI的应用可以有效地提高个人开发效率。除此之外&#xff0c;DeepSeek的思考过程、思考能力是开放的&#xff0c;这对我们对结果调优有很好的帮助效果。 DeepSeek是一个基于人工智能技术…

LabVIEW铅酸蓄电池测试系统

本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计&#xff0c;利用多点传感器采集与高效的数据处理技术&#xff0c;显著提高了蓄电池测试的准确性和效率。 ​ 项目背景 随着通用航空的快速发展&#xff0c;对飞机铅酸蓄电池的测试需求也…

ARM嵌入式学习--第十三天(I2C)

I2C --介绍 I2C&#xff08;Inter-intergrated Circuit 集成电路&#xff09;总线是Philips公司在八十年代初推出的一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信&#xff1b;I2C总线有俩根双向的信号线&#xff0c;一根数据线SDA用于收发数据&…

使用PyCharm进行Django项目开发环境搭建

如果在PyCharm中创建Django项目 1. 打开PyCharm&#xff0c;选择新建项目 2.左侧选择Django&#xff0c;并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一&#xff1a; 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…

移动机器人规划控制入门与实践:基于navigation2 学习笔记(一)

课程实践: (1)手写A*代码并且调试,总结优缺点 (2)基于Gazebo仿真,完成给定机器人在给定地图中的导航调试 (3)使用Groot设计自己的导航行为树 掌握一门技术 规划控制概述 常见移动机器人

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…

【大数据技术】本机DataGrip远程连接虚拟机MySQL/Hive

本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…

【C++篇】C++11新特性总结1

目录 1&#xff0c;C11的发展历史 2&#xff0c;列表初始化 2.1C98传统的{} 2.2&#xff0c;C11中的{} 2.3&#xff0c;C11中的std::initializer_list 3&#xff0c;右值引用和移动语义 3.1&#xff0c;左值和右值 3.2&#xff0c;左值引用和右值引用 3.3&#xff0c;…

redis之RDB持久化过程

redis的rdb持久化过程 流程图就想表达两点&#xff1a; 1.主进程会fork一个子进程&#xff0c;子进程共享主进程内存数据(fork其实是复制页表)&#xff0c;子进程读取数据并写到新的rdb文件&#xff0c;最后替换旧的rdb文件。 2.在持久化过程中主进程接收到用户写操作&#x…

操作系统—进程与线程

补充知识 PSW程序状态字寄存器PC程序计数器&#xff1a;存放下一条指令的地址IR指令寄存器&#xff1a;存放当前正在执行的指令通用寄存器&#xff1a;存放其他一些必要信息 进程 进程&#xff1a;进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位…