日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

8 包含min函数的栈

發(fā)布時間:2023/11/29 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8 包含min函数的栈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0 引言

題目:定義棧的數(shù)據(jù)結(jié)構(gòu),請?jiān)谠擃愋椭袑?shí)現(xiàn)一個能夠得到棧的最小元素的min函數(shù)。在該棧中,調(diào)用min、push及pop的時間復(fù)雜度都是O(1).

1 抽象問題具體化

2 具體問題抽象分析

需要解決的兩個主要問題如下。

(1)如何在復(fù)雜度O(1)的條件下,返回當(dāng)前棧的最小值。解決思路是定義一個minNum變量保存當(dāng)前棧的最小值。

(2)另外一個問題是如果當(dāng)前最小值被彈出了,如何更新minNum的值。解決思路是定義一個新的棧,該棧用于保存次小的值。涉及到兩步操作:

1)什么時候入棧:當(dāng)前入棧的值小于等于最小值時,入棧

2)什么時候出棧:當(dāng)前出棧值等于最小值時,更新最小值,出棧

3 demo

stack<int> myStack; // 數(shù)據(jù)棧stack<int> minorMinNum; // 輔助棧int minNum = 99999999; // 最小值void push(int value) {if(value <= minNum){ // 只有滿足當(dāng)前入棧值小于等于最小值的條件,才將該值壓入輔助棧中,同時更新最小值 minorMinNum.push(value);minNum = value; } myStack.push(value);}void pop() {int temp;if(!myStack.empty()){temp = myStack.top();myStack.pop();} if(!minorMinNum.empty()){ if(temp == minNum){ // 只有滿足當(dāng)前出棧值等于最小值的條件,更新最小值,同時輔助棧出棧 minorMinNum.pop();minNum = minorMinNum.top(); } }}int top() {return myStack.top();}int min() {return minNum;}

4 代碼優(yōu)化

可以將上述變量minNum給省掉,寫法精簡如下。

?

stack<int> myStack;stack<int> minorMinNum;void push(int value) {if(minorMinNum.empty()){minorMinNum.push(value);}else if(value <= minorMinNum.top())minorMinNum.push(value); myStack.push(value);}void pop() { if(!myStack.empty() && !minorMinNum.empty()){if(myStack.top() == minorMinNum.top())minorMinNum.pop();myStack.pop();}}int top() {return myStack.top();}int min() {return minorMinNum.top();}

?

轉(zhuǎn)載于:https://www.cnblogs.com/ghjnwk/p/10020287.html

總結(jié)

以上是生活随笔為你收集整理的8 包含min函数的栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。