劍指offer面試題30:包含min函式的棧(Java實現)
阿新 • • 發佈:2018-12-20
題目:定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的min函式,在該棧中,呼叫min,push,及pop的時間複雜度都為O(1)。
直接上程式碼:
import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<>(); //建立兩個棧 Stack1作為主棧 Stack<Integer> stack2 = new Stack<>(); //用輔棧來存放最小資料 public void push(int node) { stack1.push(node); //主棧存放資料 if (stack2.isEmpty()) { //如果輔棧為空,新增該資料。 stack2.push(node); } else if (node < stack2.peek()) { //如果新添資料比輔棧最小值還要小,那麼輔棧新增該資料 stack2.push(node); } } public void pop() { //在彈出的時候,如果當前彈出值為最小值,輔棧也進行pop。 if(stack1.peek()==stack2.peek()) stack2.pop(); stack1.pop(); } public int top() { return stack1.peek(); //top只是返回棧頂元素,不用進行增刪操作。 } public int min() { return stack2.peek(); //返回輔棧棧頂元素,棧頂存放的是最小元素。 } }
分析:
我們用一個輔棧Stack2來記錄棧的最小值為多少,以新增{9,12,5,18,3}中途取出部分資料為例,具體操作如下:
這裡使用棧頂工作模式是滿遞減模式。
1)我們新增數字9,主棧無論何時正常新增,輔棧因為是空棧,進行新增此時的棧最小元素是9
2)我們新增數字12,主棧照常新增,輔棧因為12>9,我們輔棧不進行新增(書上老師的做法是輔棧新增元素9,這裡對老師的做法進行簡單優化處理)
3)新增元素5,主棧正常新增,輔棧新增元素5(5<9)
4)新增元素18,主棧照常新增,輔棧不進行任何操作(18>5)
5)如果我們此時要取出資料,例如使用者進行pop操作,主棧pop返回資料18,因為此時(18!=5)因此,輔棧不進行任何操作;
if(stack1.peek()==stack2.peek())
stack2.pop();
stack1.pop();
6)此時再進行pop操作,主棧pop的數字是5,此時5是最小元素,因此輔棧也進行pop操作
剩下的我想就不用介紹了,希望可以幫助大家,如果大家發現問題,歡迎指出。