Unity学习之C#数据结构_栈和队列__队列__链队列

本文介绍了Unity中的C#数据结构——链队列,通过对比单链表,阐述了链队列的特点。文章详细讲解了链队列的实现过程,包括定义队列接口、创建节点以及实现接口功能。最后,通过测试展示了链队列的操作效果。
摘要由CSDN通过智能技术生成
之前我们已经介绍了多种的数据结构,并且他们之间都有一个共同点就是数据元素以及他们数据元素之间的逻辑关系是完全相同的,都是一对一的线性关系。区别在操作这些数据的规则(限制)不同。

在这里插入图片描述
这次介绍的链队列,大家可以把链队列看成是在单链表的表尾多加了一个rear的节点,作为引用,因为队列的关系,所以头结点和尾接点分表做对应的事。

三种单引用链数据结构之间的区别

在这里插入图片描述

实现链队列 上代码

一、定义队列接口

/// <summary>
    /// 队列的接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    interface IQueue<T>
    {
        int Count { get; }
        int GetLength();
        bool IsEmpty();
        void Clear();
        void Enqueue(T item);//入队
        T Dequeue();//出队,删除队首数据
        T Peek();//返回队首数据,不删除
    }

二、定义节点
有一个规律,凡是以链命名的数据结构都是通过节点来储存数据的

/// <summary>
    /// 链队列的节点
    /// </summary>
    /// <typeparam name="T"></typeparam>
    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; }
        }
    }

三、实现接口
链队列接口的实现是比较简单的,因为所有的数据操作都只选用操作队列的两端就可以了

/// <summary>
    /// 队列的实现————链队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class LinkQueue<T> : IQueue<T>
    {
        private Node<T> front;//头节点
        private Node<T> rear;//尾节点
        private int count;//表示元素的个数

        public LinkQueue()
        {
            front = null;
            rear = null;
            count = 0;
        }

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

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

        /// <summary>
        /// 出队
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (count != 0)
            {
                T temp = front.Data;
                if (count != 1)
                {
                    front = front.Next;
                    count--;
                    return temp;
                }
                else//当队列中只有一个元素的时候
                {
                    front = null;
                    rear = null;
                    count = 0;
                    return temp;
                }
            }
            else
            {
                Console.WriteLine("错误,队列为空");
                return default(T);
            }

        }

        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            Node<T> newNode = new Node<T>(item);
            if (count != 0)
            {
                rear.Next = newNode;
                rear = newNode;
            }
            else
            {
                front = newNode;
                rear = newNode;
            }
            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()
        {
            if (count != 0)
            {
                T temp = front.Data;
                return temp;
            }
            else
            {
                Console.WriteLine("错误,队列为空");
                return default(T);
            }
        }
    }

四、测试链队列

class Program
    {
        static void Main(string[] args)
        {         
            //队列测试————链队列
            LinkQueue<int> linkQueue = new LinkQueue<int>();
            //入队
            for (int i = 0; i < 20; i++)
            {
                linkQueue.Enqueue(i);
            }
            Console.WriteLine("队列长度:" + linkQueue.Count);
            //出队 10个元素
            for (int i = 0; i < 10; i++)
            {
                linkQueue.Dequeue();
            }
            Console.WriteLine("队列长度:" + linkQueue.Count);
            //出队并打印剩余的10个元素
            for (int i = 0; i < 10; i++)
            {
                Console.Write(linkQueue.Dequeue()+"、");
            }
            Console.WriteLine();
            Console.WriteLine("队列长度:" + linkQueue.GetLength());
            Console.WriteLine("队首元素:" + linkQueue.Peek());            
            Console.ReadKey();

        }
    }
测试结果

在这里插入图片描述
上面的部分,需要自己练习一下,会有更深的理解
分享让知识变得有意义!后续会继续更新一些学习中问题。
OJMars
InTheMars

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值