Min Stack (JAVA實現)

來源:互聯網
上載者:User

題目:Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.

翻譯:設計一個含有 push、pop、top、getMin功能的棧,各功能詳細說明如下:
push(x) – 將資料x壓入棧;
pop() – 將資料彈出;
top() – 獲得棧頂資料;
getMin() – 獲得棧中最小元素。

思路一—失敗的方法
失敗方法1:用數組來實現棧,但提交後報錯:error: constructor MinStack in class MinStack cannot be applied to given types;
可能原因:因為用數組來實現的棧,所以在初始化棧時需要給出棧的大小,可能因為這樣與題目要求不符。
失敗方法2:在方法1的基礎上將數組換成ArrayList,不會報上述錯誤了,但總是顯示逾時。
可能原因:在實現getMin()函數時,需要對ArrayList進行遍曆,可能耗時比較長

思路二–可實現
定義兩個棧(可以用ArrayList,也可以用Stack實現),一個正常儲存資料,記為data,一個只有當需要存入的資料小於或等於棧頂資料時才存入,記為minData;出棧時,data可直接出棧,而只有當data棧頂元素與minData棧頂元素相等時,minData才會彈出元素;通過這種方法可以保證minData中的棧頂元素始終是整個棧的最小資料。

例如:
push(4) –>data={4} ; minData={4};
push(4) –>data={4,4} ; minData={4,4};
push(5) –>data={4,4,5}; minData={4,4};
push(3) –>data={4,4,5,3}; minData={4,4,3};
pop() –> data={4,4,5}; minData={4,4};
pop() –>data={4,4}; minData={4,4};

代碼(java)–此處用的是Stack實現,用ArrayList也可以,但會稍微比Stack臃腫一些

import java.util.*;class MinStack {          Stack<Integer> data = new Stack<Integer>();    Stack<Integer> minData = new Stack<Integer>();    public void push(int x) {        data.push(x);        if(minData.isEmpty()||x <= minData.peek()){             minData.push(x);        }    }    public void pop() {        if(!data.isEmpty()){            int top = data.pop();            if(top ==  minData.peek()){                minData.pop();            }        }    }    public int top() {        if(!data.isEmpty()){            return data.peek();        }else{            return 0;        }    }    public int getMin() {        if(!minData.isEmpty()){            return minData.peek();        }else{            return 0;        }    }}

找的另一種思路的代碼

class MinStack {    Node top = null;    public void push(int x) {        if (top == null) {            top = new Node(x);            top.min = x;        } else {            Node temp = new Node(x);            temp.next = top;            top = temp;            top.min = Math.min(top.next.min, x);        }    }    public void pop() {        top = top.next;        return;    }    public int top() {        return top == null ? 0 : top.val;    }    public int getMin() {        return top == null ? 0 : top.min;    }}class Node {    int val;    int min;    Node next;    public Node(int val) {        this.val = val;    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.