對於單調棧,我以前看過這種題目在leetcode上,當時沒怎麼理解,隨意就過去了,今天又碰見了這類題目,我就看了一下,大概理解了一點,記錄一下。java
題目:定義棧的數據結構,請在該類型中實現一個可以獲得棧中所含最小元素的min函數(時間複雜度應爲O(1))。node
單調棧的實現是相對於普通的棧而言的,對於一個普通的棧,咱們想讓這個棧可以返回當前這個棧中元素的最小值,一開始個人思路出現了問題,理解上有點問題,咱們不是要對這個普通的棧要給他排序啊或者說怎麼樣,它就是一個棧,須要正常的push和pop,若是咱們改變它內部的順序,那麼它就不是一個普通的棧了,也就不是先進後出的順序了,如今僅僅是讓咱們給他增長一個功能,讓咱們返回目前這個普通棧全部元素的最小值,好比說如今咱們的棧是[5,2,4,1,3],(按照從左到右的順序入棧):數據結構
因此問題關鍵在於如何記錄最小值,以及出棧之後最小值是如何變化的,出棧的變化 ,對於每個單調棧的元素來講從開始到這個元素目前都是單調的,再進來的元素雖然比前面的元素某個小,好比上面4<5 ,可是這個4進入不了單調棧,由於到目前爲止有一個比它還要小的元素是2,因此咱們不讓他入這個單調棧,只讓他進入普通棧。函數
下面附上這題的解code
import java.util.Stack; public class Solution { Stack<Integer> stack=new Stack<Integer>(); Stack<Integer> stackMin=new Stack<Integer>(); public void push(int node) { stack.push(node); if(stackMin.isEmpty()) stackMin.push(node); else { if(node<stackMin.peek()) stackMin.push(node); } } public void pop() { if(stack.peek()==stackMin.peek()) { stack.pop(); stackMin.pop(); } else stack.pop(); return ; } public int top() { return stack.peek(); } public int min() { return stackMin.peek(); } }