數據結構之隊列

定義:隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。

隊列的數據元素又稱爲隊列元素。在隊列中插入一個隊列元素稱爲入隊,從隊列中刪除一個隊列元素稱爲出隊。因爲隊列只允許在一端插入,在另一端刪除,所以只有最早進入隊列的元素才能最先從隊列中刪除,故隊列又稱爲先進先出(FIFO—first in first out)線性表

今天我們將將順序隊列和循環隊列(附代碼實現)

 

順序隊列

首先我們要有一塊連續的存儲空間去存儲我們隊列的元素,這裏我們使用數組。當然還需要兩個指針,一個(front)指向隊頭,一個(rear)指向隊尾元素。

所謂順序隊列就是在隊尾加入一個元素rear+1,從隊頭刪除一個元素front+1。當rear增加到指向分配的連續空間之外時,隊列無法再插入新元素,但這時往往還有大量可用空間未被佔用,這些空間是已經出隊的隊列元素曾經佔用過得存儲單元,這是順序隊列的一個最大的缺點,浪費內存

循環隊列

解決順序隊列的缺點的辦法就是,當rear增加到指向分配的連續空間之外時,將rear指向數組的第一個位置。

這實際上是把隊列空間想象成一個環形空間,環形空間中的存儲單元循環使用,用這種方法管理的隊列也就稱爲循環隊列。除了一些簡單應用之外,真正實用的隊列是循環隊列。

下面是循環隊列的C#代碼實現:

 /// <summary>
    /// 循環隊列
    /// </summary>
    public class Queue
    {
        //private int[] arr;  //隊列容器
        //private int maxSize;  //容器初始化長度
        //private int front;  //隊頭元素下標
        //private int rear;  //隊尾元素下標
        //private int length;  //隊列長度

        public int[] Arr { get; set; }
        public int MaxSize { get; set; }
        public int Front { get; set; }
        public int Rear { get; set; }
        public int Length { get; set; }
        public Queue(int maxSize) 
        {
            this.Arr = new int[maxSize];
            this.MaxSize = maxSize;
            this.Front = 0;
            this.Rear = -1;
            this.Length = 0;
        }

        /// <summary>
        /// 向隊列中插入一個元素
        /// </summary>
        /// <param name="elem">加入的元素的值</param>
        public void insert(int elem) 
        {
            if (isFull()) 
            {
                Console.WriteLine("隊列已滿,不能再插入元素");
                return;
            }
            if (Rear == MaxSize-1) 
            {
                Rear = -1;
            }
            Arr[++Rear] = elem;
            Length++;
        }

        /// <summary>
        /// 從對壘中移除對頭元素
        /// </summary>
        /// <returns>返回移除的元素</returns>
        public int? remove() 
        {
            if (isEmpty()) 
            {
                Console.WriteLine("隊列爲空,沒有可以刪除的元素");
                return null;
            }
            int elem = Arr[Front++];
            if (Front == MaxSize) 
            {
                Front = 0;
            }
            Length--;
            return elem;
        }

        /// <summary>
        /// 查看隊頭元素
        /// </summary>
        /// <returns></returns>
        public int? peek() 
        {
            if (isEmpty())
            {
                Console.WriteLine("隊列爲空,沒有元素");
                return null;
            }
            return Arr[Front];
        }

        /// <summary>
        /// 判斷隊列是否爲空
        /// </summary>
        /// <returns></returns>
        public bool isEmpty() 
        {
            return (Length == 0);
        }

        /// <summary>
        /// 判斷隊列是否已滿
        /// </summary>
        /// <returns></returns>
        public bool isFull() 
        {
            if (Length == MaxSize) 
            {
                return true;
            }
            return false;
        }
    }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章