堆、棧以及隊列

這個也是比較容易翻車的東西,記錄一下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;
            }
        }

    }
}
相關文章
相關標籤/搜索