用队列实现栈(JS)

news/2024/11/16 18:35:33/

用队列实现栈

题目

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

实现 MyStack 类:

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

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsizeis 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. 入栈操作:队列也是直接push到队列数据的最后端。
  2. 出栈操作(重点):队列中只能从出口端出数据,而先出的数据是队列先入的数据,而出栈操作要的元素是最后加入的一个元素所以在队列里我们想要拿到这个元素首先要做到的就是把这个元素前面的数据全部放到这个数据后面去,如果队列大小是size,我们需要移动size-1次才能把前面size-1给个数据移动到第size的数据后面,移动完成之后,我们就可以输出第一个数据,这就是出栈要拿到的数据。

复杂度

  • 时间复杂度:

添加时间复杂度, 示例: O ( n ) O(n) O(n)

  • 空间复杂度:

添加空间复杂度, 示例: O ( n ) O(n) O(n)

Code


var MyStack = function() {this.quene=[];
};/** * @param {number} x* @return {void}*/
MyStack.prototype.push = function(x) {this.quene.push(x);
};/*** @return {number}*/
//<!-- 出栈操作 -->
MyStack.prototype.pop = function() {let x =  this.getFirst()//先将队列先size-1个元素移动到队列第size个元素后面return this.quene.shift();//删除队列第一个元素
};/*** @return {number}*/
//<!-- 读取栈顶元素,注意这里只读取,不能改变队列顺序 -->
MyStack.prototype.top = function() {let x = this.getFirst();//先拿到栈顶元素this.quene.shift();//删除栈顶元素this.quene.push(x);//还原队列,因为原先栈顶元素在队列的最后一位,在读取函数中,我们把它移动到了首位,在拿到它之后,我们必须将队列还原return x;
};/*** @return {boolean}*/
MyStack.prototype.empty = function() {if(this.quene.length===0) return true;return false;
};
MyStack.prototype.getFirst = function(){let i =this.quene.length;i--; while(i--){let x = this.quene[0];this.quene.push(x);this.quene.shift()}return this.quene[0];
}
/*** 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()*/

http://www.ppmy.cn/news/1010144.html

相关文章

【C++】容器篇(五)—— map和set的基本介绍

序言&#xff1a; 在之前&#xff0c;我们已经对STL中的 序列式容器 进行了相关的学习。本期&#xff0c;我将给大家介绍的则是另外一类容器 —— 关联式容器 &#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;容器回顾 &#x1f4a8;【顺序容器】 &a…

LeetCode-Java(06)

24. 两两交换链表中的节点 非递归解法 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0);pre.next head;ListNode temp pre;while(temp.next ! null && temp.next.next ! null) {ListNode start temp.next;ListNode end …

数据库报错1045-Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方式

文章目录 前言一、原因&#xff1a;1.数据库密码被篡改了&#xff01;2.数据库权限变更了&#xff01; 二、解决方法1.方法&#xff1a;编辑mysql配置文件my.ini2.步骤如下&#xff1a; 三、总结&#xff1a;mysql8.0版本下命令行mysqld -skip-grant-tables 失效 无法登陆问题的…

【链表OJ 1】移除链表元素val

大家好&#xff0c;欢迎来到我的博客&#xff0c;此题是关于链表oj的第一题&#xff0c;此后还会陆续更新博客&#xff0c;如有错误&#xff0c;欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…

C++/Qt读写ini文件

今天介绍C/Qt读写ini文件&#xff0c;ini文件一般是作为配置文件来使用&#xff0c;比如一些程序的一些默认参数会写在一个ini文件中&#xff0c;程序运行时会进行对应的参数读取&#xff0c;详细可以查看百度ini文件的介绍。https://baike.baidu.com/item/ini%E6%96%87%E4%BB%…

Apache RocketMQ 命令注入

漏洞简介 RocketMQ 5.1.0及以下版本&#xff0c;在一定条件下&#xff0c;存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露&#xff0c;缺乏权限验证&#xff0c;攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命令…

【新人指南】给新人软件开发工程师的干货建议

在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的成本。 这篇文章根据我多年的工作经验&#xff0c;给新人总结了一些建议&#xff0c;希望对你会有所帮助。 写好注释 没有注…

Cocos Creator的rigidBody.applyForce变成了滚动

序: 1、原因是因为没有调整摩擦系数physics-material 2、摩擦系数调整你要在你的节点 一个物理材料才会有的&#xff0c;教程没跳过去了所以没有 3、扩展阅读第一话&#xff1a;入行程序员的一波三折 最终效果&#xff1a; git录屏会卡&#xff0c;其实过程很平滑 正…