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

yizhihongxing

前端算法之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日

相关文章

  • Win7系统的快捷键大全 Win7键盘快捷键汇总

    《Win7系统的快捷键大全 Win7键盘快捷键汇总》是一篇介绍Windows 7系统快捷键的文章,下面是它的完整攻略: 引言 在 Windows 7系统 中,快捷键是提高操作效率的一种最简单又最有效的方式。如果您掌握了 Windows 7系统 的常用快捷键,不仅可以让您的工作更加高效,还可以改善您的操作体验。本篇文章将为您介绍 Windows 7系统 的常用…

    other 2023年6月27日
    00
  • java构造器的重载实现实例讲解

    Java构造器的重载实现实例讲解 构造器(Constructor)是一种特殊的方法,用于创建对象并初始化对象的成员变量。在Java中,构造器的重载是指在同一个类中定义多个构造器,它们具有相同的名称但参数列表不同。通过构造器的重载,我们可以根据不同的需求来创建对象。 构造器的重载实现步骤 要实现构造器的重载,我们需要按照以下步骤进行操作: 在类中定义多个构造器…

    other 2023年8月6日
    00
  • shell编程编辑工具awk

    Shell编程编辑工具awk 什么是awk awk是一种编程语言,用于处理文本文件的数据。它是一种强大的文本分析和处理工具,可在Linux和其他操作系统上使用。awk的名称是由三位创始人的名字组成的:Aho、Weinberger和Kernighan。 awk被设计为适合用于处理、转换和分析数据。使用它的主要目的是从数据文件中提取有用信息。它的语法简单,易于学…

    其他 2023年3月29日
    00
  • Hadoop中namenode和secondarynamenode工作机制讲解

    Hadoop中Namenode和Secondarynamenode的工作机制 在Hadoop中,Namenode是Hadoop分布式文件系统的重要组件之一,它的主要功能是管理文件系统命名空间、控制块的复制和容错、管理数据块的映射信息等。而Secondarynamenode则是辅助Namenode执行某些任务的节点,它的主要任务是定期合并Namenode的编辑…

    other 2023年6月28日
    00
  • Vue项目通过network的ip地址访问注意事项及说明

    Vue项目通过network的ip地址访问需要注意以下几点: 1. 确认本地IP地址 首先需要确认本机的IP地址,可以在Windows系统下使用ipconfig命令(如下示例)或者在MacOS系统下使用ifconfig命令,从命令行中获取本机的IP地址。 // Windows系统下获取本机IP地址的命令 ipconfig // MacOS系统下获取本机IP地…

    other 2023年6月27日
    00
  • win10和win7下java开发环境配置教程

    Win10和Win7下Java开发环境配置教程 本篇攻略主要介绍在Win10和Win7两个操作系统下,如何配置Java开发环境。本文所使用的Java版本是Java SE 8。 步骤1:下载Java SE 8 首先,我们需要下载最新版本的Java SE 8 JDK,下载地址为:https://www.oracle.com/technetwork/java/ja…

    other 2023年6月27日
    00
  • TPLink路由器隐藏wifi用户名的方法

    关于“TPLink路由器隐藏wifi用户名的方法”的完整攻略,我来详细讲解一下。 步骤一:打开TPLink路由器的管理页面 首先,我们需要打开TPLink路由器的管理界面。一般情况下,我们可以在浏览器的地址栏里输入“192.168.1.1”(也可能是“192.168.0.1”)来进入。登录时需要输入用户名和密码。如果你从未更改过路由器的管理密码,那么可以尝试…

    other 2023年6月27日
    00
  • Java中将File转化为MultipartFile的操作

    Java中将File转化为MultipartFile的操作通常用于上传文件,下面是对这个操作的完整讲解攻略: 1. 引入依赖 在pom.xml文件中引入相关依赖,一般需要引入spring-web,commons-fileupload等依赖。 <dependency> <groupId>org.springframework</g…

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