• 用两个栈实现一个队列


     
    请用两个栈,来实现队列的功能,实现功能 `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)
    
        })
     })

     
  • 相关阅读:
    shell 编写简单的整数计算器
    信号控制
    MySQL-索引及优化整理
    Java面试-Java容器有哪些
    C语言宏定义
    值类型与引用类型的区别
    C++虚函数简介
    DNS-域名解析
    扇区,簇,块区分
    Java合并两个数组为一个新数组
  • 原文地址:https://www.cnblogs.com/lxl0419/p/16197153.html
Copyright © 2020-2023  润新知