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

相关文章

  • jQuery源码解读之removeClass()方法分析

    jQuery源码解读之removeClass()方法分析 介绍 本攻略旨在详细讲解jQuery源码中removeClass()方法的实现原理和功能。removeClass()方法用于从网页元素中移除指定的CSS类。 源码解析 1. 示例代码 以下是一个简单的示例代码,展示了如何使用removeClass()方法: <!DOCTYPE html> …

    other 2023年6月28日
    00
  • 说说前端开发中的seo

    说说前端开发中的 SEO 什么是 SEO SEO(Search Engine Optimization),搜索引擎优化。它是指通过改变网站内容以及在页面上增加关键字等优化措施,以增加自然搜索引擎(例如谷歌、百度)对网站的搜索排名,从而提高网站流量,最终目的是提升网站在自然搜索结果中的可见度。 前端开发在 SEO 中的作用 前端开发中的 HTML、CSS、Ja…

    其他 2023年3月28日
    00
  • 使用递归遍历对象获得value值的实现方法

    使用递归遍历对象获得 value 值是一个常用的技巧,可以用于处理对象数据或嵌套对象。下面是一个完整的攻略,介绍实现方法的具体步骤。 步骤一:定义方法 首先,我们需要定义一个递归方法,该方法将遍历对象并返回目标值。以下是一个示例方法: function findValue(obj, targetKey) { for (var key in obj) { va…

    other 2023年6月27日
    00
  • android 中 SQLiteOpenHelper的封装使用详解

    下面我将为你详细讲解如何在 Android 中封装使用 SQLiteOpenHelper。 概述 SQLiteOpenHelper 是 Android 提供的一个 SQLite 数据库帮助类,它可以帮助我们创建数据库,并提供了升级、降级、数据迁移等功能。但是,SQLiteOpenHelper 并没有提供特别友好的 API,因此我们需要对其进行进一步的封装以提…

    other 2023年6月25日
    00
  • JS 屏蔽键盘不可用与鼠标右键不可用的方法

    为了屏蔽键盘和鼠标的某些操作,我们可以利用浏览器的事件机制,通过监听指定的事件以达到目的。下面将分别介绍屏蔽键盘和鼠标右键的方法,并提供代码示例进行说明。 屏蔽键盘操作 方法一:使用 onKeyDown 事件 监听键盘事件,通过判断事件对象的 keyCode 属性是否为需要屏蔽的键位码,来实现屏蔽操作。下面是示例代码,如需屏蔽多个键位,可在 switch 语…

    other 2023年6月27日
    00
  • 深入探讨JavaScript String对象

    深入探讨JavaScript String对象 简介 JavaScript中的String对象代表一个字符串。它是一个引用类型,并提供了很多有用的方法,可以让我们在字符串上做更多的操作。 字符串长度 可以使用length属性来获取一个字符串的长度。例如: var str = "hello"; console.log(str.length)…

    other 2023年6月20日
    00
  • vue业务实例之组件递归及其应用

    Vue业务实例之组件递归及其应用 组件递归是指在Vue应用中,将组件作为自身的一个子组件来使用,从而达到动态渲染组件的效果。这种技术在Vue应用中特别有用,因为它可以帮助我们在需要深度嵌套的数据结构中快速创建复杂的用户界面。 递归组件的基本概念 在Vue的世界中,我们可以用 components 属性来创建组件。对于一个简单的组件,我们只需要定义其 temp…

    other 2023年6月27日
    00
  • 基于Vue制作组织架构树组件

    什么是组织架构树组件?组织架构树组件是一种常见的前端组件,用于显示企业或组织机构的人员层级关系,可以让用户清晰地了解整个组织的人员关系、职位层级等信息。 Vue是什么?Vue是一款轻量级的JavaScript框架,被广泛用于开发Web应用程序。Vue具有极高的灵活性和可定制性,允许开发人员轻松构建复杂的Web组件并实现数据双向绑定和响应式UI设计。 制作组织…

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