首页 > 其他分享 >用队列实现栈

用队列实现栈

时间:2022-08-19 11:38:52浏览次数:64  
标签:queue1 队列 queue2 pop 实现 push MyStack

目录

题目描述

  1. 题目地址:https://leetcode.cn/problems/implement-stack-using-queues/
  2. 题目要求
    请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

解题思路

  1. shift()是移除第一项
  2. 一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。

解题代码

var MyStack = function() {
    this.queue1 = [];
    this.queue2 = [];//备份的队列

};


MyStack.prototype.push = function(x) {
    this.queue1.push(x);

};


MyStack.prototype.pop = function() {
    // 减少两个队列交换的次数, 只有当queue1为空时,交换两个队列
    if(!this.queue1.length) {
        [this.queue1, this.queue2] = [this.queue2, this.queue1];
    }
    while(this.queue1.length > 1) {//当队列1的元素数量大于1的时候不断将元素push进备份队列
        this.queue2.push(this.queue1.shift());
    }
    return this.queue1.shift();//最后将队列1最后一个元素出队

};


MyStack.prototype.top = function() {
    const x = this.pop();//查看栈顶,队列出队,然后在push进队列1
    this.queue1.push(x);
    return x;

};

MyStack.prototype.empty = function() {
     return !this.queue1.length && !this.queue2.length;

};


标签:queue1,队列,queue2,pop,实现,push,MyStack
From: https://www.cnblogs.com/xiayuxue/p/16601421.html

相关文章

  • 10个常用的损失函数解释以及Python代码实现
    什么是损失函数?损失函数是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误,损失函数值越低则预测越......
  • 如何实现跨数百个K8s集群的管理
    随着云原生进程的加快,传统大型业务应用系统也走上了微服务化之路。服务功能分解是应用微服务化的巨大挑战,对于大型应用系统来说更是如此。不仅如此,虽然K8s已经实现了很多......
  • B2B营销新策略 | B2B企业如何实现产品导向增长目标(附方案下载)
    产品导向增长是以产品为主导的增长,主要是一种进入市场的策略,该策略依赖于以您的产品为主要工具来获取,激活和留住客户。如果您使用过Slack或Dropbox,则亲眼目睹了产品驱动......
  • PYTHON实现倒三角打印
    目录需求数据展示最终结果实现效果代码原始版本1代码效率需求数据展示以空格分隔的990个数据最终结果实现效果代码发现我自己是真的喜欢暴力求解,当然昨天是因为有......
  • CSS实现div里面的内容超滚动
    html代码:<divclass="box"><divclass="content"></div><divclass="content"></div><divclass="content"></div><divclass="content"></div><divclas......
  • Chapter 08 - RaiseMan ( C# 实现 + NSDocument类)
    此例子实现了不用ArrayController,基于view-basedtableview实现添加和删除。当然,也可以用ArrayController实现,这样可以省去NSTableViewDelegate和NSTableViewDataSource......
  • menuconfig(基于文本(命令行)的图形化配置界面)是如何实现的
    引在编译linux内核时,makemenuconfig命令可以在命令行终端下显示“图形”配置界面。vim,top,emacs,screen等命令都可以显示“图形界面”原理[https://blog.csdn.net/Sh......
  • css实现按钮边框流动特效
      .my_btn{width:100px;height:50px;text-align:center;margin-top:10px;line-height:50px;background-color:#fff;position:relative......
  • Springboot 通过FastJson实现bean对象和Json字符串互转
    Json格式在后台服务中的重要性就不多说了,直入正题。首先引入pom文件,这里使用的是1.2.83版本1<dependency>2<groupId>com.alibaba</groupId>3......
  • JAVA之线程及多线程实现
    java的线程是什么1线程是一个程序的一条执行路径。我们之前启动程序后。main方法其他是一条独立的执行路径。2JAVA的多线程JAVA的多线程是指从软硬件实现多条执行路......