包含min函數的棧(java實現)

一、題目描述

定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。
注意:保證測試中不會當棧爲空的時候,對棧調用pop()或者min()或者top()方法。

二、問題分析

剛看到這個題的時候不太懂這道題的目的是什麼,定義棧的數據結構,拿Java來說,utils包下不是有Stack棧的定義嗎?再一看是要實現找到棧中最小元素的min函數。這下清楚了,原來是對棧數據結構的改進,自然而然想到只需要定義一個min()函數,然後遍歷完棧找到最小值返回,但是之後看別人的代碼才意識到這道題沒那麼簡單,題目的附加要求是時間複雜度爲O(1)。而遍歷棧時間複雜度就成了O(n),不符合題目要求。
那就只能犧牲空間換時間了,額外定義一個輔助棧,使得該棧與原來的棧同步壓棧,出棧(之所以同步是要保證出一個棧還能保證該輔助棧有數據)。示意圖如下:

有了輔助棧接下來的工作就簡單了,代碼如下:

代碼:

import java.util.Stack;

public class Solution {

    Stack<Integer> normal = new Stack<Integer>(); // 操作棧
    Stack<Integer> minval = new Stack<Integer>(); // 輔助棧
    public void push(int node) {
        normal.push(node); 	// 操作棧壓入元素
        if(minval.empty()){ 	// 如果輔助棧爲空,則壓入該元素
            minval.push(node);
        }else if(node > minval.peek()){ // 如果該元素大於輔助棧棧頂元素,則壓入棧頂元素即可
            minval.push(minval.peek());
        }else{	// 否則,壓入該元素
            minval.push(node);
        }
    }
    
    public void pop() {
        normal.pop();
        minval.pop();
    }
    
    public int top() {
        return normal.peek();
    }
    
    public int min() { // 輔助棧棧頂元素即爲要求最小元素
        return minval.peek();
    }
}

總結

遇到問題不要急着去寫代碼,寫審題,看清楚條件,然後再想解題思路,最後再寫代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章