最近了解堆疊的時候,從網上發現兩種觀點,把我弄得有點懵。
第一種說堆疊是一種物件集合,物件名為Stack<string>,往里面加資料時遵循,先進后出的原則,這個我理解為,是一種集合,可以遍歷。
但是接下來又看到另一種說法,說堆疊是記憶體,記憶體堆疊和記憶體堆存不同的東西,記憶體堆crl會定時清理,保證程式流暢性等。
因此我想問幾個問題
1。到底有幾種堆疊。
2.每種堆疊分別是啥意思。
3.Stack<string>這種集合啥時候用?
100分獻上,求大佬解惑打擊
uj5u.com熱心網友回復:
堆和堆疊是兩種不同的概念,不是有幾種堆是編譯器釋放分配,一般用作runtime運行時這種底層變數存盤和分配,堆疊則是程式猿自己分配和釋放,
一般用作存盤本地變數和回傳值以及函式地址等。
堆的存盤模式是比如圖,線性串列等,堆疊的存盤模式是先進后出
uj5u.com熱心網友回復:
1. 樓上說得對。堆疊概念有兩個,一個是資料結構,資料結構和應用程式代碼相關。另一個概念是程式運行的記憶體布局方式2. 如1所說
3. 在 C# 的 Stack 對應的是資料結構定義,描述一個元素先進后出的類
基本上大多數你會遇到的容器類或集合類,都是 List 為主。而 Stack 是屬于特定用途的類。那么什么是集合類或容器類?其實就是說明這個類可以包含很多其他物件,可以理解為和陣列差不多的東西
回到問題,啥時候會使用 Stack 這樣的集合?首先 `Stack<string>` 是泛形,表示的是一個 string 的 Stack 集合。而使用在需要先進入集合的字串后取出的情況
如有一個例子是我做了一個報道軟體,這個軟體是給學生用的,要求功能是越慢過來報道的學生越優先處理
此時使用的時候如有 A B C 三個學生依次過來,如何在處理的時候按照 C B A 處理?其中一個方法就是使用 Stack 存放
- 將 A 放入 Stack 中
- 將 B 放入 Stack 中
- 將 C 放入 Stack 中
依照 Stack 的特點,先進入后取出,于是 A 最先進入,于是 A 最慢取出。而 C 最后進入,所以最新取出。因此取出順序將會是 C B A 的順序
也許你會認為這個方法不夠特別,因為我從陣列最后一個開始也可以,對的。只是咱讓需求再復雜一點就可以體現出 Stack 的優勢了。如在我處理學生報道的程序中,還有不斷有學生過來報道。此時就有趣了
- 將 A 放入 Stack 中
- 將 B 放入 Stack 中
- 將 C 放入 Stack 中
- 按照 Stack 的特點,從 Stack 取出 C 學生,進入報道
- 此時 D 過來報道,將 D 放入
- 按照 Stack 的特點,取出最慢進入的學生,從 Stack 取出 D 學生
如果上面這個需求,不使用 Stack 你可以想想可以如何寫簡單
uj5u.com熱心網友回復:
就不復制網上可查到的資料了,主要是澄清一下網路上混亂的邏輯。1. “堆疊"這個詞語在硬體領域和軟體領域有不同的含義。
(1) 在硬體領域,堆疊是關于記憶體分配方式的術語,是記憶體堆(heap)與記憶體堆疊(stack)的總稱。堆和堆疊都是記憶體里的一塊具有某種特點的區域。
(2) 在軟體領域,堆(heap)和堆疊(stack)是兩種不同的抽象資料結構。值得注意的是,在中文語境下,stack常常被翻譯為“堆疊”或者“堆疊",也就是在中文語境下,資料結構中的堆疊==堆疊。
2. 搞清楚上面的東西,就可以查資料了。
3. System.Collections.Generic.Stack<T>主要用于當你想臨時存放資料的時候,也就是說你取到一個元素后就不需要它了,可以直接刪了,同時你還需要采用后進先出的邏輯,那么這個時候你就可以考慮用Stack<T>。
uj5u.com熱心網友回復:
堆就是連續的隨機訪問記憶體塊,堆疊是先進后出的記憶體塊。uj5u.com熱心網友回復:
兩個說法都是對的。好比物件既可以是你的男朋友/女朋友,也可以是C#中的一個資料存盤單元。
uj5u.com熱心網友回復:
堆疊是:[align=right]堆疊是一種執行“后進先出”演算法的資料結構。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒里面,可以發現一種規律:先放進去的小球只能后拿出來,反之,后放進去的小球能夠先拿出來。所以“先進后出”就是這種結構的特點。
堆疊就是這樣一種資料結構。它是在記憶體中開辟一個存盤區域,資料一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指標總指向最后一個壓入堆疊的資料所在的資料單元,存放這個地址指標的暫存器就叫做堆疊指示器。開始放入資料的單元叫做“堆疊底”。資料一個一個地存入,這個程序叫做“壓堆疊”。在壓堆疊的程序中,每有一個資料壓入堆疊,就放在和前一個單元相連的后面一個單元中,堆疊指示器中的地址自動加1。讀取這些資料時,按照堆疊指示器中的地址讀取資料,堆疊指示器中的地址數自動減 1。這個程序叫做“彈出pop”。如此就實作了后進先出的原則。
堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實作的。
堆疊可以用陣列存盤,也可以用以后會介紹的鏈表存盤。[/align]
uj5u.com熱心網友回復:
堆和堆疊是兩個概念。資料結構的書都有。樓上也講得很好,我覺得我講得肯定沒樓上的好,就這樣吧,哈哈哈哈哈
uj5u.com熱心網友回復:
https://www.cnblogs.com/shineblog/archive/2012/04/18/2455171.htmluj5u.com熱心網友回復:
請問一下,您說的“樓上”是指的一樓tangyanzhi1111的回復嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/6805.html
標籤:C#
