用两个栈实现一个队列

 
请用两个栈,来实现队列的功能,实现功能 `add` `delete` `length` 。
 
分析:
栈,先进后出
队列,先进先出,API 包括
- add
- delete
- length

常见的“消息队列”就是队列的一种应用场景
- A 系统向 B 系统持续发送海量的消息
- A 系统先把一条一条消息放在一个 queue
- B 系统再从 queue 中逐条消费(按顺序,先进先出)

逻辑结构和物理结构

队列和栈一样,是一种逻辑结构。它可以用数组、链表等实现。<br>
思考:用数组实现队列,性能会怎样 —— add 怎样?delete 怎样?

复杂场景下(如海量数据,内存不够用)需要单独设计。

题目分析
- 队列 add
    - 往 stack1 push 元素
- 队列 delete
    - 将 stack1 所有元素 pop 出来,push 到 stack2
    - 将 stack2 执行一次 pop
    - 再将 stack2 所有元素 pop 出来,push 进 stack1

 

 

export class MyQueue {
    private stack1:number[] = [] 
    private stack2:number[] = [] 

    // 入队
    add(n:number) {
        this.stack1.push(n)
    }
    // 出队
    delete():number | null {
        let res
        const stack1 = this.stack1
        const stack2 = this.stack2 
        // 将stack1 所有元素移动到 stack2中
        while (stack1.length) {
            const n = stack1.pop()
            if (n != null) {
                stack2.push(n)
            }
        }

        // stack2进行pop
        res = stack2.pop()

        // 将stack2中所有元素 移动到 stack1
        while (stack2.length) {
            const n = stack2.pop()
            if (n != null) {
                stack1.push(n)
            }
        }

        return res || null
    }
    // 通过属性的方法调用 
    get length():number {
        return this.stack1.length 
    }
}

// 功能测试  时间复杂度 add o(1); delete o(n)
const a = new MyQueue()
a.add(100)
a.add(200)
a.add(300)
console.log(a.length)
console.log(a.delete())
console.log(a.length)

单测

import {MyQueue} from '../两个栈实现一个队列'

 describe('两个栈实现一个队列', ()=>{
    it('add and length',()=>{
        const a = new MyQueue()

        expect(a.length).toBe(0)
        a.add(100)
        a.add(200)
        a.add(300)
        expect(a.length).toBe(3)
    })

    it('delete',()=>{
        const a = new MyQueue()

        expect(a.delete()).toBeNull()
        a.add(100)
        a.add(200)
        a.add(300)
        expect(a.delete()).toBe(100)
        expect(a.length).toBe(2)
        expect(a.delete()).toBe(200)
        expect(a.length).toBe(1)

    })
 })

 


 
posted @ 2022-04-26 23:19  夏目友人喵  阅读(36)  评论(0编辑  收藏  举报