這個也是比較容易翻車的東西,記錄一下
補充點內容差點忘了: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; } } } }