likes
comments
collection
share

用双栈实现先进先出的队列

作者站长头像
站长
· 阅读数 22

题目(力扣232题)

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

解答

  • MyQueue 类定义两个栈stack1stack2
var MyQueue = function() {
    this.stack1 = [];
    this.stack2 = [];
 };
  • push操作直接通过栈的push方法加入栈stack1
MyQueue.prototype.push = function(x) {
     this.stack1.push(x);
 };
  • pop操作从队列开头移除并返回元素,思路:先通过pop将stack1的数全部取出来然后再通过push放入stack2中,最后通过pop取出stack2的顶部元素并移除即可,但是注意,要先判断stack2中是否有元素,如果有元素,则直接通过pop取出stack2顶部元素并移除。
 MyQueue.prototype.pop = function() {
    if(!this.stack2.length){
         while (this.stack1.length) {
        this.stack2.push(this.stack1.pop());
    } 
    }
    return this.stack2.pop();
 };

通过push存入了五个数:

用双栈实现先进先出的队列

通过pop取出开头元素,并移除:

第一种情况: stack2为空,先将stack1的元素全部依次取出并放进stack2中,再取出stack2顶部元素

用双栈实现先进先出的队列

第二种情况: stack2为非空,直接取出stack2顶部元素

用双栈实现先进先出的队列

  • peek操作和pop操作不同的是,不能通过pop取出stack2的顶部元素,因为pop会移除元素,所以通过指定下标来查找并返回顶部元素。
MyQueue.prototype.peek = function() {
    if(!this.stack2.length){
        while (this.stack1.length) {
       this.stack2.push(this.stack1.pop());
   } 
   }
    return this.stack2[this.stack2.length - 1];
 };
  • empty操作:判断两个栈是否都为空,都为空则返回true,否则返回false
MyQueue.prototype.empty = function() {
  return !this.stack1.length && !this.stack2.length;
 };

用双栈实现先进先出的队列

转载自:https://juejin.cn/post/7367611991362306100
评论
请登录