什么是队列
队列(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);
}
}

