1. 程式人生 > >C# 資料結構 佇列

C# 資料結構 佇列

何為佇列

佇列(queue):是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。

佇列(Queue)是插入操作限定在表的尾部而其它操作限定在表的頭部進行的線性表。把進行插入操作的表尾稱為隊尾(Rear),把進行其它操作的頭部稱為隊頭(Front)。當佇列中沒有資料元素時稱為空佇列(Empty Queue)。

 操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_佇列 {
    interface IQueue<T> {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Enqueue(T item);//入隊
        T Dequeue();       //出隊,並刪除資料
        T Peek();         //取得隊頭的資料,不刪除
    }
}

 順序佇列

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_佇列 {
    class SeqQueue<T>:IQueue<T>
    {
        private T[] data;
        private int count;//表示當前有多少個元素
        private int front;//隊首 (隊首元素索引-1)
        private int rear;//隊尾(=隊尾元素索引)

        //構造
        public SeqQueue(int size)
        {
            data = new T[size];
            count = 0;
            front = -1;
            rear = -1;
        }

        public SeqQueue() : this(10)
        {
            
        }



        public int Count
        {
            get { return count; } 
        }

        public int GetLength()
        {
            return count;
        }

        public bool IsEmpty()
        {
            return count == 0;
        }

        public void Clear()
        {
            count = 0;
            front = rear = -1;
        }
        //入隊
        public void Enqueue(T item)
        {
            if (count == data.Length)
            {
                Console.WriteLine("佇列已滿,不可以再新增新的資料");
            }
            else
            {
                if (rear == data.Length - 1)
                {
                    //當佇列為空時,rear為-1,有一個數據時為0
                    //rear相當於從0開始計數
                    //rear==data.Length-1   即為佇列最後一個元素

                    //迴圈佇列實現
                    data[0] = item;
                    rear = 0;
                    count++;

                }
                else
                {
                    data[rear + 1] = item;
                    rear++;
                    count++;
                }
            }
        }

        public T Dequeue()
        {
            if (count > 0)
            {
                T temp = data[front + 1];//取得隊首的元素
                front++;        //引用上移,即刪除了當前的元素,指向下一個元素
                count--;
                return temp;
            }
            else
            {
                Console.WriteLine("佇列為空,無法取得隊首的資料");
                return default(T);
            }
        }

        public T Peek()
        {
            T temp = data[front + 1];
            return temp;
        }
    }
}

鏈佇列

結點

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_佇列 {
    class Node <T>
    {
        private T data;//資料
        private Node<T> next;//指標

        public Node(T data)
        {
            this.data = data;
        }

        public T Data
        {
            get { return data; }
            set { data = value; }
        }

        public Node<T> Next
        {
            get { return next; }
            set { next = value; }
        } 

    }
}

 鏈佇列

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace _003_佇列 {
    class LinkQueue <T>:IQueue<T>
    {
        private Node<T> front;//頭節點 
        private Node<T> rear;//尾結點
        private int count;//表示元素的個數
        //構造
        public LinkQueue()
        {
            front = null;
            rear = null;
            count = 0;
        }



        public int Count
        {
            get { return count; }
        }

        public int GetLength()
        {
            return count;
        }

        public bool IsEmpty()
        {
            return count == 0;
        }

        public void Clear()
        {
            front = null;
            rear = null;
            count = 0;
        }
        //入隊
        public void Enqueue(T item)
        {
            Node<T> newNode = new Node<T>(item);
            if (count == 0)
            {
                front = newNode;
                rear = newNode;
                count = 1;
            }
            else
            {
                rear.Next = newNode;
                rear = newNode;
                count++;
            }
        }
        //出隊
        public T Dequeue()
        {
            if (count == 0)
            {
                Console.WriteLine("佇列為空,無法出隊");
                return default(T);
            }else if (count == 1)
            {
                T temp = front.Data;
                front = rear = null;
                count = 0;
                return temp;
            }
            else
            {
                T temp = front.Data;
                front = front.Next;
                count--;
                return temp;
            }
        }
        //取得隊首的值
        public T Peek()
        {
            if (front != null)
            {
                return front.Data;
            }
            else
            {
                return default(T);
            }
        }
    }
}