JavaScript算法题:两个栈实现一个队列

185 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

两个栈实现一个队列

  • 请用两个栈,实现一个队列
  • 功能 add delete length 队列

队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
在现实中,最常见的队列的例子就是排队。

在计算机科学中,一个常见的例子就是打印队列。比如说我们需要打印五份文档。我们会打开每个文档,然后点击打印按钮。每个文档都会被发送至打印队列。第一个发送到打印队列的文档会首先被打印,以此类推,直到打印完所有文档。

  • 先进先出
  • API:add delete length

image.png

image.png

  • 队列是逻辑结构,抽象模型
  • 简单的,可以用数组、链表实现,数组和链表是一个物理结构
  • 复杂的队列服务,需要单独设计

TS代码

class MyQueue {
    private numStack;
    private helpStack;
    constructor() {
        this.numStack = [];
        this.helpStack = [];
    }

    push(x: number): void {
        this.numStack.push(x);
    }

    pop(): number {
        this.peek();
        return this.helpStack.pop();
    }

    peek(): number {
        if (this.helpStack.length === 0) {
            while (this.numStack.length !== 0) {
                this.helpStack.push(this.numStack.pop());
            }
        }
        return this.helpStack[this.helpStack.length-1];
    }

    empty(): boolean {
        return this.numStack.length === 0 && this.helpStack.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()
 */

划重点

  • 队列
  • 逻辑结构VS物理结构
  • 画图,帮助梳理解题思路