設計一個帶有getMin功能的棧
阿新 • • 發佈:2018-11-10
題目:
實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
要求:
1,pop, push, getMin操作的時間複雜度都是O(1).注:
1, 設計的棧型別可以使用現有的棧結構。思路:
可以考慮使用兩個棧來進行設計,一個棧用來儲存當前棧中的元素,其功能和一個正常的棧沒有區別,這個棧記為stackData;另一個棧用於儲存每一步的最小值,這個棧記為stackMin。
程式碼:
思路一:
public class MyStack1 { private Stack<Integer> stackData; // 同正常棧功能 private Stack<Integer> stackMin; //用於儲存每一步的最小值 public MyStack1() { this.stackData = new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } public void push(int newNum) { if (this.stackMin.isEmpty()) { this.stackMin.push(newNum); } else if (newNum <= this.getmin()) { this.stackMin.push(newNum); } this.stackData.push(newNum); } public int pop() { if (this.stackData.isEmpty()) { throw new RuntimeException("Your stack is empty."); } int value = this.stackData.pop(); if (value == this.getmin()) { this.stackMin.pop(); } return value; } public int getmin() { if (this.stackMin.isEmpty()) { throw new RuntimeException("Your stack is empty."); } return this.stackMin.peek(); } }
思路二:
我們一起努力吧,QQ群(478705720)海量的書籍,視訊,原始碼資料,豐富的求職內推資訊,分享給正在努力奮鬥的你!成功路上,我們風雨同行!public class MyStack2 { private Stack<Integer> stackData; private Stack<Integer> stackMin; public MyStack2() { this.stackData = new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } public void push(int newNum) { if (this.stackMin.isEmpty()) { this.stackMin.push(newNum); } else if (newNum < this.getmin()) { this.stackMin.push(newNum); } else { int newMin = this.stackMin.peek(); this.stackMin.push(newMin); } this.stackData.push(newNum); } public int pop() { if (this.stackData.isEmpty()) { throw new RuntimeException("Your stack is empty."); } this.stackMin.pop(); return this.stackData.pop(); } public int getmin() { if (this.stackMin.isEmpty()) { throw new RuntimeException("Your stack is empty."); } return this.stackMin.peek(); } }