232. 用栈实现队列

题目描述

使用栈实现队列的下列操作:

push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。示例:

MyQueue queue = new MyQueue();	
queue.push(1);	
queue.push(2);  	
queue.peek();  // 返回 1	
queue.pop();   // 返回 1	
queue.empty(); // 返回 false

说明:

你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

来源:力扣(LeetCode)

思路

这道题目是让我们用栈来模拟实现队列。我们直到栈和队列都是一种受限的数据结构。栈的特点是只能在一端进行所有操作,队列的特点是只能在一端入队,另一端出队。

在这里我们可以借助另外一个栈,也就是说用两个栈来实现队列的效果。这种做法的时间复杂度和空间复杂度都是O(n)。

由于栈只能操作一端,因此我们peek或者pop的时候也只去操作顶部元素,要达到目的 我们需要在push的时候将队头的元素放到栈顶即可。

因此我们只需要在push的时候,用一下辅助栈即可。具体做法是先将栈清空并依次放到另一个辅助栈中,辅助栈中的元素再次放回栈中,最后将新的元素push进去即可。

比如我们现在栈中已经是1,2,3,4了。我们现在要push一个5.

push之前是这样的:

640?wx_fmt=png

然后我们将栈中的元素转移到辅助栈:

640?wx_fmt=png

最后将新的元素添加到栈顶。

640?wx_fmt=png

整个过程是这样的:

640?wx_fmt=png

关键点解析

  • 在push的时候利用辅助栈(双栈)

代码

/*	
 * @lc app=leetcode id=232 lang=javascript	
 *	
 * [232] Implement Queue using Stacks	
 */	
/**	
 * Initialize your data structure here.	
 */	
var MyQueue = function() {	
  // tag: queue stack array	
  this.stack = [];	
  this.helperStack = [];	
};	
/**	
 * Push element x to the back of queue.	
 * @param {number} x	
 * @return {void}	
 */	
MyQueue.prototype.push = function(x) {	
  let cur = null;	
  while ((cur = this.stack.pop())) {	
    this.helperStack.push(cur);	
  }	
  this.helperStack.push(x);	
  while ((cur = this.helperStack.pop())) {	
    this.stack.push(cur);	
  }	
};	
/**	
 * Removes the element from in front of queue and returns that element.	
 * @return {number}	
 */	
MyQueue.prototype.pop = function() {	
  return this.stack.pop();	
};	
/**	
 * Get the front element.	
 * @return {number}	
 */	
MyQueue.prototype.peek = function() {	
  return this.stack[this.stack.length - 1];	
};	
/**	
 * Returns whether the queue is empty.	
 * @return {boolean}	
 */	
MyQueue.prototype.empty = function() {	
  return this.stack.length === 0;	
};	
/**	
 * Your MyQueue object will be instantiated and called as such:	
 * var obj = new MyQueue()	
 * obj.push(x)	
 * var param_2 = obj.pop()	
 * var param_3 = obj.peek()	
 * var param_4 = obj.empty()	
 */

扩展

  • 类似的题目有用队列实现栈,思路是完全一样的,大家有兴趣可以试一下。

  • 栈混洗也是借助另外一个栈来完成的,从这点来看,两者有相似之处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值