1. 程式人生 > >劍指offer面試題30:包含min函式的棧(Java實現)

劍指offer面試題30:包含min函式的棧(Java實現)

題目:定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的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操作

剩下的我想就不用介紹了,希望可以幫助大家,如果大家發現問題,歡迎指出。