前端算法之TypeScript包含min函数的栈实例详解

前端算法之TypeScript包含min函数的栈实例详解

一、前言

本篇文章将介绍一种栈(Stack)的实现,同时在栈中加入一个min函数,用来返回栈中最小的值。

栈是一种线性数据结构,具有“后进先出”(LIFO)的特性,它只允许在表的一端进行插入和删除操作。这个在实际生活中比较类似于一个弹簧式的球点笔,通过一个“中心轴”的作用,可以让笔芯向上或向下转动。

有很多不同的编程语言可以用来实现这个Stack栈,本文主要采用TypeScript来进行实现。

二、栈Stack的实现

通过一个简单的类来定义一个Stack类,主要包括以下几个方法:

  • push(item: T):向栈中添加新的元素;
  • pop(): T | undefined:移除栈顶的元素;
  • peek(): T | undefined:返回栈顶的元素,不对栈做修改;
  • size(): number:返回栈中元素的个数;
  • isEmpty(): boolean:判断栈是否为空。

TypeScript中定义Stack具体实现代码:

class Stack<T> {
    private items: T[] = [];

    push(item: T) {
        this.items.push(item);
    }

    pop(): T | undefined {
        return this.items.pop();
    }

    peek(): T | undefined {
        return this.items[this.items.length - 1];
    }

    size(): number {
        return this.items.length;
    }

    isEmpty(): boolean {
        return this.items.length === 0;
    }
}

三、包含min函数的Stack

在上面的基础上,实现一个新的Stack类,用来完成包含min函数的要求。

在Stack中添加一个新的成员变量minItems,用来记录每次push操作后Stack中的最小值缓存,减少查找最小值的开销。同时重写push方法,在每次push的时候,保存当前Stack中最小值。

具体实现代码如下:

class MinStack<T extends number> {
    private items: T[] = [];
    private minItems: T[] = [];

    push(item: T) {
        this.items.push(item);
        const min = this.minItems[this.minItems.length - 1];
        if (min === undefined || item <= min) {
            this.minItems.push(item);
        }
    }

    pop(): T | undefined {
        const item = this.items.pop();
        const min = this.minItems[this.minItems.length - 1];
        if (item === min) {
            this.minItems.pop();
        }
        return item;
    }

    getMin(): T | undefined {
        return this.minItems[this.minItems.length - 1];
    }

    peek(): T | undefined {
        return this.items[this.items.length - 1];
    }

    size(): number {
        return this.items.length;
    }

    isEmpty(): boolean {
        return this.items.length === 0;
    }
}
  • push方法:每次向Stack中添加元素的时候,保存当前Stack中最小值;
  • pop方法:移除栈顶的元素,并且根据最小值进行更新;
  • getMin方法:返回当前Stack中最小值。

四、使用示例

通过以下两个示例,其中一个是正常的取出栈顶元素;第二个例子是在pop出栈顶元素的时候,同时也pop出最小值。

const minStack = new MinStack<number>();
minStack.push(3);
minStack.push(2);
minStack.push(4);
console.log(minStack.getMin());// 2

console.log(minStack.pop());// 4
console.log(minStack.getMin());// 2
console.log(minStack.pop());// 2
console.log(minStack.getMin());// 3

const minStack2 = new MinStack<number>();
minStack2.push(3);
minStack2.push(2);
minStack2.push(4);
console.log(minStack2.pop());// 4
console.log(minStack2.pop());// 2
console.log(minStack2.pop());// 3
console.log(minStack2.getMin());// undefined

通过以上两个示例,我们可以看到:

第一个示例中,先给MinStack插入了3、2、4三个数,利用getMin方法分别输出了最小数2。
后续通过pop方法,弹出了4、2两个数,分别输出了正确的数字,并且在每次pop结束后,利用getMin方法返回正确的最小值,证明该Stack是正确的。

第二个示例中,先给MinStack2插入了3、2、4三个数,在依次进行pop操作,同时发现当前Stack中最小值也被pop出,最后导致getMin方法返回undefined。

五、结语

本文详细阐述了如何在TypeScript中实现一个包含min函数的栈,让开发者不仅可以实现基础的栈操作,还可以更加便捷地获取栈中最小值。同时对于学习和理解数据结构也有很大的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前端算法之TypeScript包含min函数的栈实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vue-cli4如何打包静态资源到指定目录

    为了将静态资源打包到指定目录,我们需要修改vue.config.js文件,并设置publicPath和outputDir属性。以下是详细的攻略: 第一步:创建vue.config.js文件 我们需要在项目根目录下创建vue.config.js文件,并在该文件中设置publicPath和outputDir属性。如果原来不存在该文件,可以通过如下命令创建: to…

    other 2023年6月27日
    00
  • sql获取当前时间(日期)

    获取当前时间(日期)在SQL中是常见的需求,在不同的数据库管理系统中实现方法略有不同,但是基本思路相同。下面我将针对常见的SQL数据库管理系统,比如MySQL、Oracle、SQL Server等,给出获取当前时间(日期)的完整攻略。 MySQL MySQL中有NOW()函数可以直接获取当前的日期和时间,该函数返回一个DATETIME格式的值,即年-月-日 …

    其他 2023年4月16日
    00
  • hadoop上传文件到hdfs

    Hadoop上传文件到HDFS Hadoop是一款优秀的分布式计算框架,它广泛应用于大数据领域。Hadoop的分布式特性使得它可以对大数据进行高效处理,而HDFS(Hadoop分布式文件系统)则是Hadoop的存储层。 在Hadoop的使用过程中,经常会遇到需要上传文件到HDFS的情况。以下是关于如何在Hadoop中上传文件到HDFS的详细步骤。 准备工作 …

    其他 2023年3月28日
    00
  • androidstudio全局搜索技巧

    Android Studio全局搜索技巧 在Android Studio中,全局搜索是一项非常有用的功能,可以帮助我们快速查找项目中的代码、资源、文件等。本攻略将详细介绍如何使用Android Studio的全局搜索功能,包括搜索的方法和两个示例说明。 全局搜索的方法 以下是使用Android Studio的全局搜索功能的方法: 打开Android Stud…

    other 2023年5月7日
    00
  • ios9正式版占多大内存 ios9正式版占空间大小介绍

    iOS 9是苹果公司推出的操作系统版本之一,它的占用空间大小取决于设备型号和安装的应用程序数量。以下是关于iOS 9正式版占用内存和空间大小的详细攻略: 内存占用 iOS 9正式版的内存占用因设备型号而异。一般来说,较新的设备型号具有更多的内存,因此可以更好地支持iOS 9。以下是一些示例说明: iPhone 6s Plus:iPhone 6s Plus是一…

    other 2023年8月2日
    00
  • Swift 指针底层探索分析

    Swift 指针底层探索分析攻略 1. 什么是指针? 指针是一种变量,它存储了内存地址。通过指针,我们可以直接访问和修改内存中的数据。在 Swift 中,指针的使用相对较少,但在某些情况下,使用指针可以提供更高效的内存访问和操作。 2. Swift 中的指针类型 在 Swift 中,有两种主要的指针类型:UnsafePointer 和 UnsafeMutab…

    other 2023年8月2日
    00
  • C++链表节点的添加和删除介绍

    下面是详细的「C++链表节点的添加和删除介绍」攻略。 添加节点 首先需要创建链表的结构体,来存储节点的信息,比如节点值和指向下一个节点的指针。下面是一个基本的链表结构体模板: struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 接下来就可以…

    other 2023年6月27日
    00
  • Access2007表怎么设置字段的默认值?

    设置Access2007表的字段默认值可以通过设计表时的属性设置或者使用SQL语句来实现。下面详细讲解这两种方法的步骤。 方法一:设计表时设置默认值属性 打开Access2007并选择创建一个新表。 在创建表格的界面内,点击要设置默认值属性的字段。 在“字段属性”区域下拉框中选择“默认值”选项。 在文本框中输入默认值,例如输入“0”代表该字段默认值为0。 保…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部