簡體   English   中英

如果可以對數組執行相同的操作,堆棧的目的是什么?

[英]What is the purpose of stack, if you can do the same operations with an array?

編程中使用“堆棧”的頻率如何? 換句話說,如果我們用數組替換堆棧,我們會失去一些東西嗎? 還是有什么特殊情況無法將堆棧替換為其他堆棧? 我只是一個C ++初學者,我對堆棧所了解的只是它們用於存儲數據的知識,因此對我來說這個主題似乎不太清楚。 任何信息都很准確。

“堆棧”是支持先進先出的數據結構的通用名稱。 數組是堆棧的一種可能的實現。 鏈表也可以實現堆棧。

考慮一個堆棧,該堆棧會隨着添加的更多元素而動態增長,並且沒有預設限制。 一個簡單的C樣式數組不支持此功能,因為它的大小在編譯時受到限制。 一個std::vector在某種程度上類似於數組,但更為復雜,它將允許這種動態增長。 (鏈接列表也可以,但是通常效率較低)。

對於一個新程序員來說,“先進先出”並不總是那么具有描述性,對於擁有更多編程經驗的人而言,它可能並不那么具有描述性。 堆棧的概念(這里不是專門指C ++(或其他語言)對象)是一個泛濫到編程的概念(整個SO中對此概念都進行了很好的描述,我相信我會如果我在這里詳細描述它,則會出現“錯誤”。

在您討論的堆棧數據類型的設計和行為與編程的“事物”(稱為調用棧)之間確實存在聯系。 在計算機硬件中,下面還簡要討論了堆棧的概念。

做調用堆棧有些不公

具體來說,調用堆棧是跟蹤程序中調用的對象。 進行的調用越多,在堆棧的“頂部”添加的調用就越多。 調用完成后,將其實例從堆棧中刪除,並將程序的控制權返回給調用函數。

因此,我具有三個“功能”: ABC

A呼叫B B然后呼叫C

堆棧的順序為:

C
B
A

C的解決方案優先於其他解決方案(或“它具有控制權”)。 直到C被解決,其他人才能完成他們的操作。 一旦解決,它就會從堆棧中“彈出”,然后B執行它需要做的事情。 在這里,我們找到FILO(先進先出)的概念: A是第一個電話; 但是,在其他情況下,直到這個問題都無法解決。

Wikipedia很好地描述了調用堆棧,並為其提供了一個很好的圖像(無需閱讀文章,該圖像並沒有太大幫助,請參見下面的圖像進行討論):

來自維基百科的調用堆棧圖像

為了達到非常高級的目的,此圖向我們展示了一個關於堆棧概念的重要內容:它被設想為一系列元素 (在本例中為過程位置,黃色條形)相互堆疊 訪問調用堆棧的工作如上所述,將立即需要的內容添加到頂部,並在不再需要時將其刪除。

一疊紙牌或一疊盤子通常被用作類比來描述一疊紙的行為。

這個對堆棧溢出問題的答案很好地解釋了堆棧。

與硬件堆棧平等

您最好在其他地方閱讀有關硬件堆棧的信息。 但是,據我了解,它的執行與上面的調用堆棧類似,但是它具有數據而不是過程。 不幸的是,我還不足以區分硬件堆棧和調用堆棧。 但是,無論如何,FILO的概念仍然適用。

為什么堆棧很重要?

堆棧對象抽象的目的是更好地模仿堆棧的操作。 事實上,如果我的理解是正確的, stack被提議作為控制程序調用的方式,往往是什么實現在“架構層面”進行內存管理。

堆棧數據類型抽象迫使程序員以模仿調用堆棧和硬件堆棧(或作為其根)的方式與抽象進行交互。 我們當然可以使用數組來執行此操作,但是堆棧使我們能夠輕松地執行操作。

該答案假定您對C ++ STL stack<>vector<>模板類之間的差異感興趣。
堆棧提供向量功能的子集。 這意味着堆棧實現比向量實現更具自由度。
堆棧保證:

  • 恆定時間推送
  • 恆定時間彈出

但是除了上述以外,向量還可以保證:

  • 帶有索引的恆定時間隨機訪問

為了提供具有索引的恆定時間隨機訪問,所有元素必須嚴格存儲,這對於堆棧來說不是必需的。 當大小超出容量時,必須重新分配向量並進行復制,但是堆棧不需要該向量。 因此,由於附加的要求,可以使用鏈表實現堆棧,但不能使用向量表。

換句話說,如果我們用數組替換堆棧,我們會失去一些東西嗎?

是的,我們將放寬實施的自由度。

暫無
暫無

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

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