Blink

纸上得来终觉浅,绝知此事要躬行

数据结构:队列

什么是队列

队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
通常,称进数据的一端为 “队尾”,出数据的一端为 “队头”,数据元素进队列的过程称为 “入队”,出队列的过程称为 “出队”。

《数据结构:队列》

  • 举个栗子:
    我们在日常生活中经常会排队,比如:去银行排队办业务,我们都是有素质讲文明的好青年(坚决不会出现插队的想象),最先去排队的人站在第一个,后面来排队的依次往后排,业务员依次安装排队顺序办业务。这和数据结构中的队列是一样的

代码实现

  • 首先定义一个队列的节点类,用来保持数据和指向下一个节点的引用
/// <summary>
/// 队列节点
/// </summary>
public class QueueNode<T>
{   
    public T data;
    public QueueNode<T> next;

    public QueueNode(T data){
        this.data = data;
    }
}
  • 实现队列类,封装对队列的操作
public class MyQueue<T>{
    private QueueNode<T> m_Head = null;
    private QueueNode<T> m_Tail = null;
    private int m_Count = 0;

    public MyQueue(){

    }

    public int Count{
        get{return m_Count;}
    }

    public bool IsEmpty{
        get{return m_Count == 0;}
    }

    /// <summary>
    /// 入队
    /// </summary>
    /// <param name="data"></param>
    public void Enqueue(T data){
        QueueNode<T> newNode = new QueueNode<T>(data);
        if (IsEmpty) {
             m_Head = m_Tail = newNode;
        }else{
            m_Tail.next = newNode;
            m_Tail = newNode;
        }
        m_Count++;
    }

    /// <summary>
    /// 获取对头数据
    /// </summary>
    /// <returns></returns>
    public T Peek(){
        if (IsEmpty) return default(T);
        return m_Head.data;
    }

    /// <summary>
    /// 出队
    /// </summary>
    /// <returns></returns>
    public T Dequeue(){
        if(IsEmpty){
            return default(T);
        }else{
            T data = m_Head.data;
            if (m_Head == m_Tail) {
                m_Head = m_Tail = null;
            }else{
                m_Head = m_Head.next;
            }
            m_Count--;
            return data;
        }
    }

    /// <summary>
    /// 清空队列
    /// </summary>
    public void Clear(){
        m_Head = null;
        m_Tail = null;
        m_Count = 0;
    }
}

测试

class Program
{
    public static void Main(string[] args)
    {
        MyQueue<int> que = new MyQueue<int>();
        que.Enqueue(100);
        que.Enqueue(200);
        Console.WriteLine(que.Count);
        Console.WriteLine(que.Peek());
        Console.WriteLine(que.Dequeue());
        Console.WriteLine(que.Count);
        Console.WriteLine(que.Dequeue());
        Console.WriteLine(que.IsEmpty);
        que.Enqueue(100);
        que.Enqueue(200);
        Console.WriteLine(que.Count);
        Console.WriteLine(que.Peek());
        Console.WriteLine(que.Dequeue());
        Console.WriteLine(que.Count);
        Console.WriteLine(que.Dequeue());
        Console.WriteLine(que.IsEmpty);
        Console.ReadKey(true);
    }
}

《数据结构:队列》

点赞

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注