簡體   English   中英

按升序排序堆棧?

[英]Sorting a Stack in Ascending Order?

按升序排序堆棧的最佳方法是什么 遇到了這個面試問題,我遇到了一些問題,以獲得最佳和最有效的解決方案。

我能想到兩種方法。

  1. 彈出堆棧的所有內容並將它們存儲在一個數組中,然后對該數組進行排序
    O(nLog n)然后將內容推回堆棧。 不是最好的方式....

  2. 執行堆棧的遞歸實現以對其進行排序

void sort(stack)
{
    type x;

    if (!isEmpty(stack)) {
        x = pop(stack);
        sort(stack);
        insert(x, stack);
    }           
}

void insert(x, stack)
{
    type y;

    if (!isEmpty(stack) && top(stack) < x) {
        y = pop(stack);
        insert(x, stack);
        push(y, stack);
    } 
    else {
        push(x, stack);
    }
} 

但是第二種方法似乎是進行了太多的遞歸調用,如果堆棧真的很大,那么開銷將是一個問題。

是否有可能以更好的方式解決這個問題,以獲得最佳的空間和時間復雜度?

有很多遞歸調用(重疊的子問題),這是dynamic programming類型問題的競爭者嗎?

解決這個問題的最佳方法是什么?

這是一個堆棧。 你看不到除了最高價值之外的任何東西。 你必須至少彈出一次,然后至少推送一次。 第一種方法很好。

如果堆棧操作很昂貴,但你有一個時間截止日期,請在彈出時使用插入排序,並且可以在完成最后一次彈出后立即按下。 但是你說這是用C ++編寫的,所以我懷疑我們是在考慮這種情況。

您可以通過消除遞歸來解決。 為此,您只需在堆棧下使用循環迭代,直到它為空。

例如,偽代碼:

Linekd Stack stack = new List ();

while stack is not empty then

     element <- stack removes peek

     / / Recursiong
     push new elements on stack

end

這個問題的復雜性不能小於O(n ^ 2)。 有關詳細參考,請參閱此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM