算法系列15天速成——第九天 队列
2015-01-16 09:13
471 查看
原文:算法系列15天速成——第九天 队列
可能大家都知道,线性表的变种非常非常多,比如今天讲的“队列”,灰常有意思啊。
一:概念
队列是一个”先进先出“的线性表,牛X的名字就是“First in First Out(FIFO)”,
生活中有很多这样的场景,比如读书的时候去食堂打饭时的”排队“。当然我们拒绝插队。
二:存储结构
前几天也说过,线性表有两种”存储结构“,① 顺序存储,②链式存储。当然“队列”也脱离
不了这两种服务,这里我就分享一下“顺序存储”。
顺序存储时,我们会维护一个叫做”head头指针“和”tail尾指针“,分别指向队列的开头和结尾。
View Code
可能大家都知道,线性表的变种非常非常多,比如今天讲的“队列”,灰常有意思啊。
一:概念
队列是一个”先进先出“的线性表,牛X的名字就是“First in First Out(FIFO)”,
生活中有很多这样的场景,比如读书的时候去食堂打饭时的”排队“。当然我们拒绝插队。
二:存储结构
前几天也说过,线性表有两种”存储结构“,① 顺序存储,②链式存储。当然“队列”也脱离
不了这两种服务,这里我就分享一下“顺序存储”。
顺序存储时,我们会维护一个叫做”head头指针“和”tail尾指针“,分别指向队列的开头和结尾。
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqQueue { public class Program { static void Main(string[] args) { SeqQueue<Student> seqQueue = new SeqQueue<Student>(); SeqQueueClass queueManage = new SeqQueueClass(); Console.WriteLine("目前队列是否为空:" + queueManage.SeqQueueIsEmpty(seqQueue) + "\n"); Console.WriteLine("将ID=1,2,3的实体加入队列\n"); queueManage.SeqQueueIn(seqQueue, new Student() { ID = 1, Name = "hxc520", Age = 23 }); queueManage.SeqQueueIn(seqQueue, new Student() { ID = 2, Name = "一线码农", Age = 23 }); queueManage.SeqQueueIn(seqQueue, new Student() { ID = 3, Name = "51cto", Age = 23 }); Console.WriteLine("\n当前队列个数:" + queueManage.SeqQueueLen(seqQueue) + ""); Console.WriteLine("\n*********************************************\n"); Console.WriteLine("我要出队了\n"); queueManage.SeqQueueOut(seqQueue); Console.WriteLine("哈哈,看看跟顺序队列异样之处,我再入队,看是否溢出\n"); queueManage.SeqQueueIn(seqQueue, new Student() { ID = 4, Name = "博客园", Age = 23 }); Console.WriteLine("\n....一切正常,入队成功"); Console.WriteLine("\n当前队列个数:" + queueManage.SeqQueueLen(seqQueue) + ""); Console.Read(); } } #region 学生数据实体 /// <summary> /// 学生数据实体 /// </summary> public class Student { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } #endregion #region 队列的数据结构 /// <summary> /// 队列的数据结构 /// </summary> /// <typeparam name="T"></typeparam> public class SeqQueue<T> { private const int maxSize = 3; public int MaxSize { get { return maxSize; } } /// <summary> /// 顺序队列的存储长度 /// </summary> public T[] data = new T[maxSize]; //头指针 public int head; //尾指针 public int tail; //队列中有效的数字个数 public int size; } #endregion #region 队列的基本操作 /// <summary> /// 队列的基本操作 /// </summary> public class SeqQueueClass { #region 队列的初始化操作 /// <summary> /// 队列的初始化操作 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> public SeqQueue<T> SeqQueueInit<T>(SeqQueue<T> seqQueue) { seqQueue.size = seqQueue.head = seqQueue.tail = 0; return seqQueue; } #endregion #region 队列是否为空 /// <summary> /// 队列是否为空 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> /// <returns></returns> public bool SeqQueueIsEmpty<T>(SeqQueue<T> seqQueue) { //如果两指针重合,说明队列已经清空 if (seqQueue.size == 0) return true; return false; } #endregion #region 队列是否已满 /// <summary> /// 队列是否已满 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> /// <returns></returns> public bool SeqQueueIsFull<T>(SeqQueue<T> seqQueue) { //采用循环队列后,头指针 if (seqQueue.size == seqQueue.MaxSize) return true; return false; } #endregion #region 队列元素入队 /// <summary> /// 队列元素入队 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> /// <param name="data"></param> /// <returns></returns> public SeqQueue<T> SeqQueueIn<T>(SeqQueue<T> seqQueue, T data) { //如果队列已满,则不能进行入队操作 if (SeqQueueIsFull(seqQueue)) throw new Exception("队列已满,还入啥队列啊!"); //采用循环队列,必须先赋值,在自增tail指针 seqQueue.data[seqQueue.tail] = data; seqQueue.tail = (seqQueue.tail + 1) % seqQueue.MaxSize; //队列实际元素增加 seqQueue.size++; return seqQueue; } #endregion #region 队列元素出队 /// <summary> /// 队列元素出队 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> /// <returns></returns> public T SeqQueueOut<T>(SeqQueue<T> seqQueue) { if (SeqQueueIsEmpty(seqQueue)) throw new Exception("队列已空,大哥,不要在出队了!"); //循环队列出队,展现的是head的灵活性 seqQueue.head = (seqQueue.head + 1) % seqQueue.MaxSize; //队列实际元素递减 seqQueue.size--; return seqQueue.data[seqQueue.head]; } #endregion #region 获取队头元素 /// <summary> /// 获取队头元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> /// <returns></returns> public T SeqQueuePeek<T>(SeqQueue<T> seqQueue) { if (SeqQueueIsEmpty(seqQueue)) throw new Exception("队列已空,不能进行出队操作"); return seqQueue.data[seqQueue.head]; } #endregion #region 获取队列长度 /// <summary> /// 获取队列长度 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="seqQueue"></param> /// <returns></returns> public int SeqQueueLen<T>(SeqQueue<T> seqQueue) { return seqQueue.size; } #endregion } #endregion }
相关文章推荐
- 算法系列15天速成——第九天 队列
- 算法系列15天速成 第九天 队列
- 算法系列15天速成——第九天 队列
- 算法系列15天速成——第九天 队列
- 算法系列15天速成——第九天 队列
- 算法系列15天速成——第九天 队列
- 算法系列15天速成——第十四天 图【上】
- 算法系列15天速成——第三天 七大经典排序【下】
- 算法系列15天速成——第十一天 树操作(上)
- 算法系列15天速成——第一天 七大经典排序【上】
- 算法系列15天速成——第十五天 图【下】(大结局)
- 算法系列15天速成——第五天 五大经典查找【中】
- 算法系列15天速成——第三天 七大经典排序【下】
- 算法系列15天速成——第四天 五大经典查找【上】
- 算法系列15天速成——第八天 线性表【下】
- 算法系列15天速成——第十天 栈
- 算法系列15天速成——第二天 七大经典排序【中】
- 算法系列15天速成——第十一天 树操作(上)
- 算法系列15天速成——第十三天 树操作【下】
- 算法系列15天速成——第四天 五大经典查找【上】