返回

每日一题 剑指offer javascript版 用两个栈实现队列

前端

正文

在日常的开发中,我们经常会遇到队列这种数据结构。队列是一种先进先出的数据结构,类似于现实生活中的排队。为了实现队列,我们可以使用数组或链表等数据结构。但是,如果我们只能使用两个栈,该如何实现队列呢?

用两个栈实现队列

要使用两个栈实现队列,我们可以使用一个栈作为输入栈,另一个栈作为输出栈。当我们向队列中添加元素时,我们将元素压入输入栈。当我们从队列中删除元素时,我们将输入栈中的所有元素弹出并压入输出栈,然后从输出栈中弹出元素。

代码实现

class Queue {
    constructor() {
        this.inputStack = [];
        this.outputStack = [];
    }

    appendTail(element) {
        this.inputStack.push(element);
    }

    deleteHead() {
        if (this.outputStack.length === 0) {
            while (this.inputStack.length > 0) {
                this.outputStack.push(this.inputStack.pop());
            }
        }
        if (this.outputStack.length === 0) {
            return -1;
        }
        return this.outputStack.pop();
    }
}

时间复杂度

  • appendTail 操作的时间复杂度为 O(1)。
  • deleteHead 操作的时间复杂度为 O(n),其中 n 为队列中元素的个数。

空间复杂度

空间复杂度为 O(n),其中 n 为队列中元素的个数。

示例

const queue = new Queue();
queue.appendTail(1);
queue.appendTail(2);
queue.appendTail(3);
console.log(queue.deleteHead()); // 1
console.log(queue.deleteHead()); // 2
console.log(queue.deleteHead()); // 3
console.log(queue.deleteHead()); // -1

总结

使用两个栈实现队列是一种巧妙的方法。虽然时间复杂度较差,但空间复杂度较好。在实际开发中,如果需要经常添加和删除元素,可以使用数组或链表等数据结构实现队列。如果内存受限,可以使用两个栈实现队列。