我正在閱讀CTCI的書,發(fā)現(xiàn)這個(gè)答案令人困惑。目標(biāo)是創(chuàng)建一個(gè)堆棧數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)可以在O(1)中推送,彈出和最小化(獲取堆棧中的最小元素)。我編寫了一個(gè)具有兩個(gè)堆棧的類,一個(gè)用于保存最小值,一個(gè)用作常規(guī)堆棧。代碼如下。據(jù)我所知,這可以通過測試來完成。 public static class StackWithMin extends Stack<Integer>{ Stack<Integer> stack; Stack<Integer> minStack; public StackWithMin(){ stack = new Stack<Integer>(); minStack = new Stack<Integer>(); } public void push(int value){ if(value <= min()){ minStack.push(value); } stack.push(value); } public Integer pop(){ int value = stack.pop(); if(value == min()){ minStack.pop(); } return value; } public int min(){ if(minStack.isEmpty()){ return Integer.MAX_VALUE; } return minStack.peek(); } }但是,書中給出的答案對我來說并不完全清楚。我已經(jīng)用Java學(xué)習(xí)了兩門課程,但是用了C語言學(xué)習(xí)了最后兩門,所以我的OOP概念有些生銹。該類中只有一個(gè)堆棧字段,并使用super調(diào)用更新“常規(guī)”堆棧,并使用s2調(diào)用更新最小堆棧。在Java visualizer中查看此內(nèi)容僅顯示一個(gè)堆棧對象,該對象顯然存儲了兩個(gè)不同的堆棧。此實(shí)現(xiàn)有效,但是我不確定為什么。澄清將不勝感激!public class Q2 /* MinStack */ extends Stack<Integer> { private Stack<Integer> min = new Stack<Integer>(); public void push(int item) { if (min.isEmpty() || item < min()) { min.push(item); } super.push(item); } public Integer pop() { int item = super.pop(); if (item == min()) { min.pop(); } return item; } public Integer min() { return min.peek(); }
添加回答
舉報(bào)
0/150
提交
取消