成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起聊聊包含min函數的棧

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

前言

基于數據結構: “棧”,實現一個min函數,調用此函數即可獲取棧中的最小元素。在該棧中,調用min、push、pop的時間復雜度都是O(1)。

思路梳理

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

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

很顯然,我們僅僅添加一個變量用來存儲最小元素是不夠的,也就是說當最小元素被取出時,我們希望得到次最小元素。那么,我們能否用一個輔助棧專門來存放這些最小元素呢?當元素入棧時,我們就取出輔助棧中的棧頂元素將其與新加入元素做大小比較,把較小的一方壓入輔助棧中。

我們通過一個例子來講解下這個過程,如下所示:

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

入棧過程如下圖所示:

圖片

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

圖片

實現代碼

經過前面的分析,我們已經得出了完整的思路,接下來就是編碼環節了,如下所示:

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();
// 比較當前入棧元素與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,我們在之前文章中已經實現了它,對此感興趣的開發者請移步:數組實現棧與對象實現棧的區別

我們將上個章節的例子代入上述實現的函數中,來看下它能否正確運行。

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("當前棧內最小值為:", stackMinFn.min());

圖片

示例代碼

本文所列舉的代碼完整版請移步:

  • StackContainingMinFunction.ts
  • stackContainingMinFunction-test.ts
責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2023-12-28 09:55:08

隊列數據結構存儲

2022-04-06 08:23:57

指針函數代碼

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-04-26 07:30:00

promptUI非結構化

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2022-10-08 00:00:05

SQL機制結構

2023-03-07 07:05:29

生產數據庫運維

2021-07-31 11:40:55

Openresty開源

2023-08-02 08:35:54

文件操作數據源

2022-12-06 08:12:11

Java關鍵字

2022-09-08 08:50:17

SSDOracleCPU

2025-04-11 00:05:49

RPC底層分布式

2024-09-09 08:53:56

2024-06-14 09:32:12

2022-10-28 07:27:17

Netty異步Future
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天插天天射天天干 | 一区二区三区在线 | 91啪亚洲精品 | 亚洲日韩欧美一区二区在线 | 欧美精品啪啪 | 国产精品国产三级国产aⅴ无密码 | 国产成人福利 | 久久久www成人免费精品 | 国产三级网站 | 日本 欧美 三级 高清 视频 | 毛片区| 色婷婷亚洲国产女人的天堂 | 懂色av蜜桃av | 99久久久国产精品 | 一级片av| 99精品亚洲国产精品久久不卡 | h在线免费观看 | 91高清视频在线观看 | 欧美爱爱视频 | 国产精品久久久久久久久久久新郎 | 人人艹人人爽 | av大片在线观看 | 亚洲网在线 | 亚洲精品丝袜日韩 | аⅴ资源新版在线天堂 | 欧美一级高潮片免费的 | 久久视频精品 | 欧美一区二区三区精品 | 日韩欧美一区在线 | 91精品国产乱码久久久久久 | 欧美日韩国产一区二区三区 | 天天夜碰日日摸日日澡 | 成人3d动漫一区二区三区91 | 99热最新网址 | 精品视频在线免费观看 | 在线精品观看 | 91在线精品一区二区 | 麻豆视频在线免费看 | 欧美日韩亚洲国产综合 | 91资源在线| 99国产精品99久久久久久 |