2021/03/05 每日一题 用栈实现队列

LeetCode上用栈实现队列,简单难度,涉及数据结构,记录下解题思路

因为这里要用实现队列的功能
在数据结构中栈是先进后出队列是先进先出
所以要用栈来实现队列的功能,最需要解决的就是数据进出顺序的问题
假设现在有一个栈[1,2,3,4]
的模式下只能从后往前取元素,例如想取出2这个元素,就需要经过[1,2,3] > [1,2] > [1]这个过程,每次都是取栈的最后一位。
同理添加元素也只能添加到最后一位
但是在队列模式下,取元素是从队列首位取出,添加元素是添加到末尾

那么要用栈实现队列的功能,就要设置两个栈作为进队和出队的操作,现在设置input入队栈output出队栈


向下箭头表示数据放入的顺序,因为栈是先进后出,这里要模拟的是先进先出的效果
相当于把input入队栈重新翻转了一次将之前最后放入的元素放在栈的前面,最先放入的元素放到了栈尾。
比如1,是第一个传入的元素,之后再pop取元素的话就是能够第一个就拿到了,实现了先进先出的效果

var MyQueue = function() {
    // 创建两个栈
    this.input = []
    this.output = []
};
// 添加元素,是添加到队尾
MyQueue.prototype.push = function(x) {
    this.input.push(x)
};
// 取出元素是取队头
MyQueue.prototype.pop = function() {
    // 如果出队栈为空,进行翻转操作
    if(this.output.length === 0) {
        // 取入队栈里面所有元素
        while(this.input.length) {
            // 从后往前取放入出队栈
            this.output.push(this.input.pop())
        }
    }
   // 返回出队栈的最后一个元素,即入队栈的第一个元素
    return this.output.pop()
};

MyQueue.prototype.peek = function() {
    // 同样操作
    if(this.output.length === 0) {
         while(this.input.length) {
            this.output.push(this.input.pop())
        }
    }
   // 因为翻转过,所以出队栈最后一位就是入队栈的第一位,也就是队列头
   return this.output[this.output.length - 1]
};

MyQueue.prototype.empty = function() {
   if(this.input.length || this.output.length){
       return false
   } else{
       return  true
   }
};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容