這個也是比較容易翻車的東西,記錄一下c#
補充點內容差點忘了:C#裏面數據結構
棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。函數
堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。spa
堆.net
1,有人總是搞不明白堆和棧的叫法。我來解釋下:code
堆:在c裏面叫堆,在c#裏面其實叫託管堆。爲何叫託管堆,咱們往下看。對象
棧:就是堆棧,由於和堆一塊兒叫着彆扭,就簡稱棧了。blog
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; } } } }