06 C# 实现链队列

C# 的链队列是什么

C# 的链队列是一种基于链表实现的队列数据结构,它与普通队列相比,可以更快地执行插入、删除操作,因为它不需要移动元素只需要修改指针即可。我们可以通过定义一个节点类来实现链队列,该节点类包含一个元素值和指向下一个节点的指针。链队列的主要操作包括向队列尾部添加元素、从队列头部删除元素以及获取队列头部元素等。在使用链队列时,需要注意空队列的处理和链表结点的释放。

另外,C# 的链队列还支持一些常用操作,比如获取队列长度、清空队列、判断队列是否为空等功能。可以通过定义一个队列类来实现这些操作,并在类中定义一个头指针和尾指针来维护队列。头指针指向链表的第一个节点,尾指针指向链表的最后一个节点,队列的长度可以通过遍历整个链表来求得。

在实际应用中,链队列被广泛地应用于数据传输、任务调度等领域,因为它具有操作灵活、效率高等优点。同时,由于链队列的实现原理比较简单,也很容易被初学者理解和掌握。因此,学习 C# 链队列不仅可以提高编程能力,还可以为日后的开发工作打下坚实的基础。

队列和链队列区别

队列和链队列都是常见的数据结构,它们的区别在于实现方式不同:

  1. 存储方式:队列通常使用数组实现,而链队列则使用链表实现。
  2. 运算效率:队列一般在队首和队尾均支持快速存取,但在队列中间进行插入和删除时效率较低,需要移动大量元素;链队列支持快速在队首和队尾进行插入和删除,但在访问队列中间的元素时效率较低,需要遍历链表。
  3. 空间复杂度:队列的空间复杂度较低,只需固定长度的数组或动态扩容数组,而链队列使用链表来存储元素,需要为每个元素额外分配节点空间,因此空间开销较大。

总之,队列适合在数据访问速度较快,元素数量不大的情况下使用;当需要在队列中间进行插入、删除操作,或者元素数量较大时,可以考虑使用链队列来提高效率。

自定义Node.cs

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

namespace _03_Queue
{
    class Node<T>
    {
        //存储的类型
       private T data;

        public T Data
        {
            get { return data; }
            set { data = value; }
        }
        //存储节点的引用
        private Node<T> next;

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


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

自定义LinkQueue.cs

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

namespace _03_Queue
{
    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 void Clear()
        {
            front = null;
            rear = null;
            count = 0;

        }

        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 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 int GetLength()
        {
            return count;
        }

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

        public T Peek()
        {
            if (front!=null)
            {
                return front.Data;
            }
            else
            {
                return default (T);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值