這個也是比較容易翻車的東西,記錄一下 補充點內容差點忘了:C#裡面 棧是編譯期間就分配好的記憶體空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變數、值類型參數等都在棧記憶體中。 堆是程式運行期間動態分配的記憶體空間,你可以根據程式的運行情況確定要分配的堆記憶體的大小。 堆 1,有人老是搞不明白堆 ...
這個也是比較容易翻車的東西,記錄一下
補充點內容差點忘了:C#裡面
棧是編譯期間就分配好的記憶體空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變數、值類型參數等都在棧記憶體中。
堆是程式運行期間動態分配的記憶體空間,你可以根據程式的運行情況確定要分配的堆記憶體的大小。
堆
1,有人老是搞不明白堆和棧的叫法。我來解釋下:
堆:在c裡面叫堆,在c#裡面其實叫托管堆。為什麼叫托管堆,我們往下看。
棧:就是堆棧,因為和堆一起叫著彆扭,就簡稱棧了。
2,托管堆:
托管堆不同於堆,它是由CLR(公共語言運行庫(Common Language Runtime))管理,當堆中滿了之後,會自動清理堆中的垃圾。所以,做為.net開發,我們不需要關心記憶體釋放的問題。
3,什麼是記憶體堆棧與數據結構堆棧,我們來看看什麼是記憶體堆棧,什麼是數據結構堆棧
①數據結構堆棧:是一種後進先出的數據結構,它是一個概念,圖4-1中可以看出,棧是一種後進先出的數據結構。
②記憶體堆棧:存在記憶體中的兩個存儲區(堆區,棧區)。
棧區:存放函數的參數、局部變數、返回數據等值,由編譯器自動釋放
堆區:存放著引用類型的對象,由CLR釋放
棧是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(TOP),對棧的基本操作有進棧(Push)和出棧(POP),俗稱後進先出
由於棧是一個表,因此任何實現表的方式都能實現棧
棧用C#實現的方式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnilateralismChainTable; namespace StackApply { public class CStack { //調用鏈表類 private Clist m_List; public CStack() { //構造函數 m_List = new Clist(); } /// <summary> /// 壓入堆棧 /// </summary> public void Push(int PushValue) { //參數: int PushValue 壓入堆棧的數據 m_List.Append(PushValue); } /// <summary> /// 彈出堆棧數據,如果為空,則取得 2147483647 為 int 的最大值; /// </summary> public int Pop() { //功能:彈出堆棧數據 int PopValue; if (!IsNullStack()) { //不為空堆棧 //移動到頂 MoveTop(); //取得彈出的數據 PopValue = GetCurrentValue(); //刪除 Delete(); return PopValue; } // 空的時候為 int 類型的最大值 return 2147483647; } /// <summary> /// 判斷是否為空的堆棧 /// </summary> public bool IsNullStack() { if (m_List.IsNull()) return true; return false; } /// <summary> /// 堆棧的個數 /// </summary> public int StackListCount { get { return m_List.ListCount; } } /// <summary> /// 移動到堆棧的底部 /// </summary> public void MoveBottom() { m_List.MoveFrist(); } /// <summary> /// 移動到堆棧的Top /// </summary> public void MoveTop() { m_List.MoveLast(); } /// <summary> /// 向上移動 /// </summary> public void MoveUp() { m_List.MoveNext(); } /// <summary> /// 向上移動 /// </summary> public void MoveDown() { m_List.MovePrevious(); } /// <summary> /// 取得當前的值 /// </summary> public int GetCurrentValue() { return m_List.GetCurrentValue(); } /// <summary> /// 刪除取得當前的結點 /// </summary> public void Delete() { m_List.Delete(); } /// <summary> /// 清空堆棧 /// </summary> public void Clear() { m_List.Clear(); } } }
隊列也是表,然而使用隊列時插入在一端進行而刪除在另一端進行,這一點跟棧不一樣的地方就是隊列是先進先出的
對於隊列的基本操作有入隊和出隊
隊列用C#實現的方式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnilateralismChainTable; namespace Alignment { /// <summary> /// 隊列類 /// </summary> public class CQueue { private Clist m_List; public CQueue() { //構造函數 //這裡使用到前面編寫的List m_List = new Clist(); } /// <summary> /// 入隊 /// </summary> public void EnQueue(int DataValue) { //功能:加入隊列,這裡使用List 類的Append 方法: //尾部添加數據,數據個數加1 m_List.Append(DataValue); } /// <summary> /// 出隊 /// </summary> public int DeQueue() { //功 能:出隊 //返回值: 2147483647 表示為空隊列無返回 int QueValue; if (!IsNull()) { //不為空的隊列 //移動到隊列的頭 m_List.MoveFrist(); //取得當前的值 QueValue = m_List.GetCurrentValue(); //刪除出隊的數據 m_List.Delete(); return QueValue; } return 2147483647; } /// <summary> /// 判斷隊列是否為空 /// </summary> public bool IsNull() { //功能:判斷是否為空的隊列 return m_List.IsNull(); } /// <summary> /// 清空隊列 /// </summary> public void Clear() { //清空鏈表 m_List.Clear(); } /// <summary> /// 取得隊列的數據個數 /// </summary> public int QueueCount { get { //取得隊列的個數 return m_List.ListCount; } } } }