單調棧

對於單調棧,我以前看過這種題目在leetcode上,當時沒怎麼理解,隨意就過去了,今天又碰見了這類題目,我就看了一下,大概理解了一點,記錄一下。java

題目:定義棧的數據結構,請在該類型中實現一個可以獲得棧中所含最小元素的min函數(時間複雜度應爲O(1))。node

單調棧的實現是相對於普通的棧而言的,對於一個普通的棧,咱們想讓這個棧可以返回當前這個棧中元素的最小值,一開始個人思路出現了問題,理解上有點問題,咱們不是要對這個普通的棧要給他排序啊或者說怎麼樣,它就是一個棧,須要正常的push和pop,若是咱們改變它內部的順序,那麼它就不是一個普通的棧了,也就不是先進後出的順序了,如今僅僅是讓咱們給他增長一個功能,讓咱們返回目前這個普通棧全部元素的最小值,好比說如今咱們的棧是[5,2,4,1,3],(按照從左到右的順序入棧):數據結構

  • 1     那麼從5開始,棧裏面只有一個5,因此最小值爲5,返回5.           單調棧[5]
  • 2       棧中元素[5,2],那麼此時返回2                                               單調棧[5,2]
  • 3      對於4這個元素入棧之後,最小值應該仍是2,                             單調棧[5,2]
  • 4      對於1入棧後,確定返回1                                                              單調棧[5,2,1]
  • 5     對於3,入棧之後返回應該也是1                                                    單調棧[5,2,1]  

因此問題關鍵在於如何記錄最小值,以及出棧之後最小值是如何變化的,出棧的變化 ,對於每個單調棧的元素來講從開始到這個元素目前都是單調的,再進來的元素雖然比前面的元素某個小,好比上面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();
    }
}
相關文章
相關標籤/搜索