之前我们已经介绍了多种的数据结构,并且他们之间都有一个共同点就是数据元素以及他们数据元素之间的逻辑关系是完全相同的,都是一对一的线性关系。区别在操作这些数据的规则(限制)不同。
这次介绍的链队列,大家可以把链队列看成是在单链表的表尾多加了一个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