永发信息网

初学者,用c#怎样实现队列

答案:1  悬赏:50  手机版
解决时间 2021-02-01 00:45
初学者,用c#怎样实现队列
最佳答案
/// <summary>
    /// 环形队列
    /// </summary>
    public class MyQueue<T>
    {
        private T[] _array; // 队列容器
        private int _head;  // 队头指针
        private int _tail;  // 队尾指针
        private int _size;  // 容器大小
        private const int increment = 5;  // 队列增量
        static T[] _emptyArray = new T[0];
        public MyQueue()
        {
            _array = _emptyArray;
        }
        public MyQueue(int capacity)
        {
            if (capacity < 0) throw new ArgumentOutOfRangeException("capacity");

            _array = new T[capacity];
            _head = 0;
            _tail = 0;
            _size = 0;
        }

        /// <summary>
        /// 队列元素数目
        /// </summary>
        public int Count { get { return _size; } }

        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item">队列元素</param>
        public void Enqueue(T item)
        {
            if (_size == _array.Length)
            {
                SetCapacity(_size + increment);
            }

            _array[_tail] = item;
            _tail = (_tail + 1) % _array.Length;
            _size++;
        }

        /// <summary>
        /// 出队
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (_size == 0) throw new InvalidOperationException("空队列");

            T removed = _array[_head];
            _array[_head] = default(T);
            _head = (_head + 1) % _array.Length;
            _size--;

            return removed;
        }

        /// <summary>
        /// 动态调整队列大小
        /// </summary>
        /// <param name="capacity"></param>
        private void SetCapacity(int capacity)
        {
            T[] newarray = new T[capacity];
            if (_size > 0)
            {
                if (_head < _tail) {
                    Array.Copy(_array, _head, newarray, 0, _size);
                }else{
                    Array.Copy(_array, _head, newarray, 0, _array.Length - _head);
                    Array.Copy(_array, 0, newarray, _array.Length - _head, _tail);
                }
            }

            _array = newarray;
            _head = 0;
            _tail = (_size == capacity) ? 0 : _size;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyQueue<int> mq = new MyQueue<int>();
            mq.Enqueue(1);
            mq.Enqueue(2);
            mq.Enqueue(3);
            mq.Enqueue(4);

            Console.ReadKey(true);
        }
    }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我总是怀疑她,是不是喜欢一个人就不要怀疑她
叫胡瑞的有多少人
要建立一个良好的班集体,形成良好的班风,我
我和孩子都是黄岛非农业户口,老公的户口在老
如果给车子装上了gps还会掉吗
少年白了头(打一成语)
张仲景被称为“医圣”,他的哪一著作至今仍为
三国无双7猛将传点什么键开始战斗
工行的步步为赢利率是多少
苹果6plus手机4G网如何变3G网
郝好竞选班长的演讲主题是“班级成员必须关爱
下列过程中没有发生化学变化的是BA. 粮食酿酒
张家和是傻逼吗
【money意思】makeagoodmoney是什么意思可选
我家的泰迪狗突然拉肚子了怎么办?
推荐资讯
微信上说卡西格表只需 23块邮费免费领真的假
网络招商是什么意思
移动手机转移到电信手机
华为荣耀6plus系统更新好还是不更新好
云上舞坊艺术培训中心地址好找么,我有些事要
谁给我个迫降航班在线观看的地址,谢谢了。
乐逍遥茶园地址在什么地方,想过去办事
微信云交易是怎么收取手续费的?
良友网吧地址有知道的么?有点事想过去
银行业协会确定的利率是()。A.法定利率B.固定
求太平歌词《世态炎凉》的音频或视频,最好有
百乐网吧怎么去啊,我要去那办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?