C#实现顺序队列

1. BCL中的队列

    BCL中实现了Queue,有队列的操作。

1.1 Program.cs

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

namespace _403_队列
{
    class Program
    {
        static void Main(string[] args)
        {
            1.使用BCL中的队列
            Queue<int> queue = new Queue<int>();
            //入队(添加数据)
            queue.Enqueue(3);//入队(放在队尾)
            queue.Enqueue(4);//入队(放在队尾)
            queue.Enqueue(5);//入队(放在队尾)
            queue.Enqueue(6);//入队(放在队尾)
            queue.Enqueue(7);//入队(放在队尾)

            Console.WriteLine("添加了3 4 5 6 7后队列大小为:" + queue.Count);

            //出队(取得队首数据并删除)
            int i = queue.Dequeue();
            Console.WriteLine("取得队首元素为:" + i);
            Console.WriteLine("出队后队列大小为:" + queue.Count);

            //取得队首元素但不删除
            int j = queue.Peek();
            Console.WriteLine("Peek后取得的元素:" + j);
            Console.WriteLine("Peek后对列大小:" + queue.Count);

            queue.Clear();
            Console.WriteLine("Clear后队列大小:" + queue.Count);
            Console.ReadKey();
        }
    }
}

2. 自己定义实现顺序队列

    定义了一个IQueue接口,用于队列的方法属性的定义,再在SeqQueue中实现。

2.1 IQueue.cs(接口)

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

namespace _403_队列
{
    interface IQueue<T>
    {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Enqueue(T item);
        T Dequeue();
        T Peek();
    }
}

2.2 SeqQueue.cs(实现接口)

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

namespace _403_队列
{
    class SeqQueue<T> : IQueue<T>
    {
        private int count;//对列中元素个数
        private int front;//对头(等于队首元素索引-1)
        private int rear;//队尾(等于队尾元素索引值)
        private T[] data;

        public SeqQueue(int size)
        {
            data = new T[size];
            count = 0;
            front = -1;
            rear = -1;
        }
        public SeqQueue():this(10)
        {

        }
        /// <summary>
        /// 对列中元素个数
        /// </summary>
        public int Count
        {
            get
            {
                return count;
            }
        }

        /// <summary>
        /// 清空对列
        /// </summary>
        public void Clear()
        {
            count = 0;
            front = rear = -1;
        }

        /// <summary>
        /// 出队(取得队首元素并删除
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if(count>0)
            {
                T temp = data[front + 1];
                front++;
                count--;
                return temp;

            }
            else
            {
                Console.WriteLine("队列为空,无法取得队首元素");
                return default(T);
            }
        }

        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            if (count == data.Length)
            {
                Console.WriteLine("对列已满");
            }
            else
            {
                if (rear == data.Length - 1)
                {
                    data[0] = item;
                    rear = 0;
                }
                else
                {
                    data[rear + 1] = item;
                    rear++;
                }
                count++;
            }
        }

        /// <summary>
        /// 获得对列长度
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return count;
        }

        /// <summary>
        /// 对列是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return count == 0;
        }

        /// <summary>
        /// 取得队列队头元素,但不删除
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            return data[front + 1];
        }
    }
}

2.3 Program.cs

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

namespace _403_队列
{
    class Program
    {
        static void Main(string[] args)
        {//2.使用自己定义的顺序栈
            SeqQueue<int> queue = new SeqQueue<int>();
            //入队(添加数据)
            queue.Enqueue(3);//入队(放在队尾)
            queue.Enqueue(4);//入队(放在队尾)
            queue.Enqueue(5);//入队(放在队尾)
            queue.Enqueue(6);//入队(放在队尾)
            queue.Enqueue(7);//入队(放在队尾)

            Console.WriteLine("添加了3 4 5 6 7后队列大小为:" + queue.Count);

            //出队(取得队首数据并删除)
            int i = queue.Dequeue();
            Console.WriteLine("取得队首元素为:" + i);
            Console.WriteLine("出队后队列大小为:" + queue.Count);

            //取得队首元素但不删除
            int j = queue.Peek();
            Console.WriteLine("Peek后取得的元素:" + j);
            Console.WriteLine("Peek后对列大小:" + queue.Count);

            queue.Clear();
            Console.WriteLine("Clear后队列大小:" + queue.Count);
            Console.ReadKey();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/a962035/article/details/79796214
今日推荐