我想寫一個函數來計算(不是設計)給定堆棧的最小值。我認爲我可以在網上輕鬆找到,但我發現沒有什麼。我發現的所有內容都是如何用getMinimum函數設計堆棧。在Java中計算(不設計!)堆棧的最小值
不同之處在於,當您設計這樣的堆棧時,您將逐步構建堆棧(推送和彈出)並在任何操作後更新最小值。我在想,如果你有一個給定的堆棧,並且你想計算這個堆棧的最小值,那麼你如何處理這個堆棧呢?也許,我沒有很好的理由,或者我問自己錯誤的答案,或者我不太瞭解堆棧的概念,但是讓我感到驚訝的是,在網絡中沒有找到任何答案,甚至在很多搜索...
這裏是我的嘗試:
public static int min(Stack stack){
Stack temp = new Stack();
int result = Integer.MAX_VALUE;
while(!stack.isEmpty()) {
int value = stack.pop();
temp.push(value);
result = (result >= value)? value : result;
}
//stack is empty now, I have to recuperate it from the temp stack
while(!temp.isEmpty()) {
stack.push(temp.pop());
}
return result;
}
在這段代碼中,我用我自己的堆棧和節點實施。但正如你所看到的,代碼非常簡單。我寫這篇文章主要是因爲我問了很多關於這個問題的問題。
特別是,我想問問你請了三個主要問題:
- 是什麼時候和這個功能的空間複雜度?我認爲這是O(N),是不是?我在計劃中總會遇到一些困難。它通常是O(2 * N)(它等於O(N)),因爲我們運行每個節點的堆棧節點。
- 我的方法是否合乎邏輯?據我所知,如果你想獲得棧中第k個元素的訪問權限,你必須彈出k-1之前的元素。或者在這裏,我認爲,如果我們只想調整其最小值(如果您想再次操作同一個堆棧),那麼彈出整個堆棧是絕對不合邏輯的。這就是爲什麼我做了第二個while循環來保持堆棧處於原始狀態。
- 也許,我們可以製作一個堆棧的副本,但是我讀到用java編寫克隆對象並不那麼容易,我想知道這樣的一個小函數是否會消耗很多?
感謝
另外,如果你不想修改「addToStack」功能,你真的不能讓這個分功能更好,所以是您的解決方案我也會嘗試。我也想說,複雜性是O(n) – Dodekeract
恩,我在我的IDE中嘗試過,它的工作原理。但說實話,這不是真正的計算分鐘(它可以是最大或其他)。它更多的是瞭解堆棧概念背後的概念和效用:) – salamanka44
是的,是的,是的(不要使用克隆,永遠,我懷疑你的攻擊類實現它合理)。這在代碼審查方面確實會更好,但總體思路是正確的。 – Voo