欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端算法之TypeScript包含min函數(shù)的棧實(shí)例詳解

 更新時(shí)間:2022年09月26日 10:16:42   作者:神奇的程序員  
這篇文章主要為大家介紹了前端算法之TypeScript包含min函數(shù)的棧實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

基于數(shù)據(jù)結(jié)構(gòu): “棧”,實(shí)現(xiàn)一個(gè)min函數(shù),調(diào)用此函數(shù)即可獲取棧中的最小元素。在該棧中,調(diào)用min、push、pop的時(shí)間復(fù)雜度都是O(1)。

本文就跟大家分享下這個(gè)算法,歡迎各位感興趣的開(kāi)發(fā)者閱讀本文。

思路梳理

相信大多數(shù)開(kāi)發(fā)者看到這個(gè)問(wèn)題,第一反應(yīng)可能是每次往棧中壓入一個(gè)新元素時(shí),將棧里的所有元素排序,讓最小的元素位于棧頂,這樣就能在O(1)的時(shí)間內(nèi)得到最小元素了。但這種思路不能保證最后入棧的元素能夠最先出棧,因此這個(gè)思路行不通。

緊接著,我們可能會(huì)想到用一個(gè)變量來(lái)存放最小的元素,每次壓入一個(gè)新元素入棧時(shí),如果它比當(dāng)前最小的元素還要小,則更新最小元素。這樣子做目的是達(dá)到了,但是又會(huì)有另一個(gè)問(wèn)題:如果當(dāng)前最小元素被彈出棧了,那么如何得到下一個(gè)最小的元素?

很顯然,我們僅僅添加一個(gè)變量用來(lái)存儲(chǔ)最小元素是不夠的,也就是說(shuō)當(dāng)最小元素被取出時(shí),我們希望得到次最小元素。那么,我們能否用一個(gè)輔助棧專(zhuān)門(mén)來(lái)存放這些最小元素呢?當(dāng)元素入棧時(shí),我們就取出輔助棧中的棧頂元素將其與新加入元素做大小比較,把較小的一方壓入輔助棧中。

我們通過(guò)一個(gè)例子來(lái)講解下這個(gè)過(guò)程,如下所示:

const stack = [
  3,
  5,
  7
  12,
  1,
  9,
  0
]

入棧過(guò)程如下圖所示:

出棧時(shí),我們同時(shí)彈出兩個(gè)棧的棧頂元素,獲取最小元素時(shí),我們將輔助棧的棧頂元素返回即可,過(guò)程如下圖所示:

實(shí)現(xiàn)代碼

經(jīng)過(guò)前面的分析,我們已經(jīng)得出了完整的思路,接下來(lái)就是編碼環(huán)節(jié)了,如下所示:

export class StackContainingMinFunction extends Stack {
  private minStack: Stack;
  private dataStack: Stack;
  constructor() {
    super();
    this.minStack = new Stack();
    this.dataStack = new Stack();
  }
  public push(item: number): void {
    this.dataStack.push(item);
    if (this.minStack.size() > 0) {
      const minVal = this.minStack.peek();
      // 比較當(dāng)前入棧元素與minStack中的最小元素,將小的一方入minStack
      item > minVal ? this.minStack.push(minVal) : this.minStack.push(item);
      return;
    }
    this.minStack.push(item);
  }
  public pop(): void {
    this.minStack.pop();
    this.dataStack.pop();
  }
  public min(): number | null {
    if (this.minStack.size() > 0) return this.minStack.peek();
    return null;
  }
}

注意:上述代碼繼承了Stack,我們?cè)谥拔恼轮幸呀?jīng)實(shí)現(xiàn)了它,對(duì)此感興趣的開(kāi)發(fā)者請(qǐng)移步:數(shù)組實(shí)現(xiàn)棧與對(duì)象實(shí)現(xiàn)棧的區(qū)別

我們將上個(gè)章節(jié)的例子代入上述實(shí)現(xiàn)的函數(shù)中,來(lái)看下它能否正確運(yùn)行。

const stackMinFn = new StackContainingMinFunction();
stackMinFn.push(3);
stackMinFn.push(5);
stackMinFn.push(7);
stackMinFn.push(12);
stackMinFn.push(1);
stackMinFn.push(9);
stackMinFn.push(0);
stackMinFn.pop();
stackMinFn.pop();
stackMinFn.pop();
console.log("當(dāng)前棧內(nèi)最小值為:", stackMinFn.min());

示例代碼

本文所列舉的代碼完整版請(qǐng)移步:

以上就是前端算法之TypeScript包含min函數(shù)的棧實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于TypeScript min函數(shù)棧的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Typescript tsconfig.json的配置詳情

    Typescript tsconfig.json的配置詳情

    這篇文章主要為大家介紹了Typescript tsconfig.json的配置詳情示例 ,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 微信小程序?qū)崿F(xiàn)圖片自適應(yīng)(支持多圖)

    微信小程序?qū)崿F(xiàn)圖片自適應(yīng)(支持多圖)

    這篇文章主要介紹了微信小程序如何實(shí)現(xiàn)圖片自適應(yīng)的相關(guān)資料,文中介紹的方法同樣適應(yīng)于多圖,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • Spartacus中navigation?item?reducer實(shí)現(xiàn)解析

    Spartacus中navigation?item?reducer實(shí)現(xiàn)解析

    這篇文章主要為大家介紹了Spartacus中navigation?item?reducer實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • js 獲取今天以及過(guò)去日期

    js 獲取今天以及過(guò)去日期

    這篇文章主要介紹了js獲得當(dāng)前系統(tǒng)日期時(shí)間以及過(guò)去系統(tǒng)日期時(shí)間的方法,涉及javascript操作日期時(shí)間的相關(guān)技巧,示例代碼如下,需要的朋友可以參考下
    2017-04-04
  • TypeScript與JavaScript的區(qū)別分析

    TypeScript與JavaScript的區(qū)別分析

    TypeScript可以使用JavaScript中的所有代碼和編程概念,TypeScript是為了使JavaScript的開(kāi)發(fā)變得更加容易而創(chuàng)建的。推薦先精通JS的的前提下再學(xué)習(xí)TS,這樣更有利于同時(shí)學(xué)習(xí)兩門(mén)語(yǔ)言。
    2022-12-12
  • DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer

    DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer

    這篇文章主要為大家介紹了基于DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • TypeScript 交叉類(lèi)型使用方法示例總結(jié)

    TypeScript 交叉類(lèi)型使用方法示例總結(jié)

    這篇文章主要為大家介紹了TypeScript 交叉類(lèi)型使用方法示例總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解

    TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解

    這篇文章主要為大家介紹了TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • typescript type 分配條件類(lèi)型示例詳解

    typescript type 分配條件類(lèi)型示例詳解

    這篇文章主要為大家介紹了typescript type 分配條件類(lèi)型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • TypeScript類(lèi)型操作之字符串處理功能詳解

    TypeScript類(lèi)型操作之字符串處理功能詳解

    這篇文章主要為大家介紹了TypeScript類(lèi)型操作之字符串處理功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論