1 . 定義棧的數據結構;實現Push、Pop、Top、Min方法;時間複雜度爲O(1) 。node
思路:定義兩個棧。一個存儲棧,一個輔助棧。數據結構
Push方法:1. 存儲棧 -- 正常進棧便可。函數
2. 輔助棧 -- 先定義一個數(隨意,目的是讓第一個進棧的數進輔助棧),而後將這個數與以後進棧的數進行比較,當在這以後進棧的數小於這個數的時候,就把他存在輔助棧,若大於等於,則忽略,直接不執行。spa
Pop方法:1 . 存儲棧 -- 正常出棧便可。code
2 . 輔助棧 -- 若是存儲棧出棧的這個數等於輔助棧將要出棧的數,那麼輔助棧出棧,負責不搭理他,也不要出。blog
Top方法:只需 return stack1.Peek(); 其中stack1表示的是存儲棧,這裏普及一下(Stack.peek()和Stack.pop()的相同點是 獲取棧頂的值,不一樣點 則是 Stack.peek()只是獲取棧頂的值,而Stack.pop()是獲取棧頂的值而後刪除。)it
Min方法:在第二部Pop的時候來一手這個 Min = minstack2.Peek(); ,很穩,其中 minstack2表示的是輔助棧。io
來,爲了更好的理解,看圖咯!!class
using System.Collections.Generic; //using泛型集合類List、DIctionary、Queue、Stack、SortedList,若不引用不可運行 class Solution { //定義兩個棧,一個存儲棧,一個輔助棧 Stack<int> stack1 = new Stack<int>(); Stack<int> minstack2 = new Stack<int>(); //先定義一個最小值Min,其中他的初始狀態是int類型中的最大值(單純的湊數而已,可有可無) int Min=int.MaxValue; //push方法,首先是存儲棧進棧,而後一個if函數,若進棧的這個數比輔助棧裏面最小的數還小,則輔助棧也執行進棧 public void push(int node) { stack1.Push(node); if(node<Min) { Min=node; minstack2.Push(node); } } //pop方法,若存儲棧pop出的數等於最小值,輔助棧執行POP方法 public void pop() { if(stack1.Pop()== Min) { minstack2.Pop(); Min = minstack2.Peek(); } } //Stack.peek()和Stack.pop()的相同點是 獲取棧頂的值, //不一樣點 則是 Stack.peek()只是獲取棧頂的值,而Stack.pop()是獲取棧頂的值而後刪除。 public int top() { return stack1.Peek(); } //不解釋 public int min() { return Min; } }