堆、棧以及佇列

飲雪俊楓發表於2018-10-09

這個也是比較容易翻車的東西,記錄一下

補充點內容差點忘了: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;
            }
        }

    }
}

 

相關文章