C#实现数据结构-线性表(三)

本文章纯属个人练习笔记,如有错误欢迎纠正。

顺序队列和链队列实现

1、通用接口实现如下:

namespace 手撕数据结构之线性表.顺序队列及链队列
{
    /// <summary>
    /// 通用接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    interface IQueue<T>
    {
        void Enqueue(T item);
        T Dequeue();
        T Peek();
        int Count { get; }
        int GetLength();
        void Clear();
        bool IsEmpty();
    }
}

2、顺序队列实现类如下:

namespace 手撕数据结构之线性表.顺序队列
{
    class SeqQueue<T> : IQueue<T>
    {
        private T[] datas; //数据存储
        private int length; //队列中元素的个数
        private int front; //队首元素的索引(-1表示队列为空)
        private int tail; //队尾元素的索引

        public SeqQueue(int size) //构造函数初始化
        {
            datas = new T[size];
            length = 0;
            front = -1;
            tail = -1;
        }

        public SeqQueue() : this(100) //初始化队列大小为100
        {

        }

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

        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            if (length == datas.Length)
            {
                Console.WriteLine("队列已满!");
            }
            else
            {
                if (tail == datas.Length - 1)
                {
                    tail = -1; //重置队尾索引,使其指向队列的开头
                }

                tail++;
                datas[tail] = item;
                length++;
            }
        }

        /// <summary>
        /// 出队(删除队首元素)
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            if (length > 0)
            {
                front++;
                if (front == datas.Length - 1)
                {
                    front = -1; //重置队首索引,使其指向队列开头
                }

                T temp = datas[front];
                length--;
                return temp;
            }
            else
            {
                Console.WriteLine("队列为空!");
                return default(T);
            }
        }

        /// <summary>
        /// 出队(不删除队首元素)
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            if (length > 0)
            {
                int index = front + 1;
                if (index == datas.Length)
                {
                    index = 0;
                }

                T temp = datas[index];
                return temp;
            }
            else
            {
                Console.WriteLine("队列为空!");
                return default(T);
            }
        }

        /// <summary>
        /// 清空队列
        /// </summary>
        public void Clear()
        {
            length = 0;
            front = -1;
            tail = -1;
        }

        /// <summary>
        /// 获取队列元素个数
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return length;
        }

        /// <summary>
        /// 判断队列是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return length == 0;
        }
    }
}

测试代码:

namespace 手撕数据结构之线性表.顺序队列及链队列
{
    class Program
    {
        static void Main(string[] args)
        {
            SeqQueue<string> queue = new SeqQueue<string>();

            queue.Enqueue("abc");
            queue.Enqueue("123");
            queue.Enqueue("23456");
            Console.WriteLine("队中元素个数:" + queue.Count);
            Console.WriteLine(queue.Dequeue());
            Console.WriteLine("队中元素个数:" + queue.Count);
            queue.Clear();
            Console.WriteLine("队中元素个数:" + queue.Count);
        }
    }
}

3、链队列实现如下:

链队列节点类:

namespace 手撕数据结构之线性表.链队列
{
    /// <summary>
    /// 链队列的节点类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class Node<T>
    {
        private T data; //数据存储
        private Node<T> next; //指向下一个节点的指针

        public Node()
        {
            data = default(T);
            next = null;
        }

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

        public Node(Node<T> next)
        {
            data = default(T);
            this.next = next;
        }

        public Node(T data, Node<T> next)
        {
            this.data = data;
            this.next = next;
        }

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

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

链队列实现类:

namespace 手撕数据结构之线性表.链队列
{
    /// <summary>
    /// 链队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class LinkQueue<T> : IQueue<T>
    {
        private Node<T> front; //头节点
        private Node<T> tail; //尾节点
        private int length; //元素个数

        public LinkQueue() //构造函数初始化
        {
            front = null;
            tail = null;
            length = 0;
        }

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

        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="item"></param>
        public void Enqueue(T item)
        {
            Node<T> newNode = new Node<T>(item);
            if (length == 0) //当前队列为空的时候
            {
                front = newNode;
                tail = newNode;
                length = 1;
            }
            else
            {
                tail.Next = newNode;
                tail = newNode;
                length++;
            }
        }

        /// <summary>
        /// 出队(删除队首元素)
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            T temp = default(T);
            if (IsEmpty())
            {
                Console.WriteLine("队列为空!");
                return temp;
            }
            else if (length == 1) //当前只有一个数据
            {
                temp = front.Data;
                front = tail = null;
                length = 0;
                return temp;
            }
            else
            {
                temp = front.Data;
                front = front.Next;
                length--;
                return temp;
            }
        }

        /// <summary>
        /// 出队(不删除队首元素)
        /// </summary>
        /// <returns></returns>
        public T Peek()
        {
            if (front != null)
                return front.Data;
            else
                return default(T);
        }

        /// <summary>
        /// 获取队列元素个数
        /// </summary>
        /// <returns></returns>
        public int GetLength()
        {
            return length;
        }

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

        /// <summary>
        /// 判断队列是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return length == 0;
        }
    }
}

测试代码:

namespace 手撕数据结构之线性表.顺序队列及链队列
{
    class Program
    {
        static void Main(string[] args)
        {
            LinkQueue<string> queue = new LinkQueue<string>();

             queue.Enqueue("abc");
             queue.Enqueue("123");
             queue.Enqueue("23456");
             Console.WriteLine("队中元素个数:" + queue.Count);
             Console.WriteLine(queue.Dequeue());
             Console.WriteLine("队中元素个数:" + queue.Count);
             queue.Clear();
             Console.WriteLine("队中元素个数:" + queue.Count);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值