C#数据结构与算法系列(三):队列
1.介绍
队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则,即:先存入队列的数据,要先取出。后存入的要后取出
队列是属于线性结构中的一种
2.图示

3.通过数组实现
public class CircleArrayQueue
{
/// <summary>
/// 队列最大值
/// </summary>
public int MaxSize { get; set; } /// <summary>
/// 队列头部
/// </summary>
public int Front { get; set; } /// <summary>
/// 队列尾部
/// </summary>
public int Rear { get; set; } /// <summary>
/// 队列数组
/// </summary>
public int[] Arr { get; set; } /// <summary>
/// 构造函数初始化队列
/// </summary>
/// <param name="maxSize"></param>
public CircleArrayQueue(int maxSize)
{
this.MaxSize = maxSize+;
Arr = new int[MaxSize];
//Front = 0;
//Rear = 0; 默认值
} /// <summary>
/// 判断队列是否为满;当尾索引的下一个为头索引时表示队列满,将队列容量空出一个作为约定
/// </summary>
/// <returns></returns>
public bool IsFull() => (Rear + ) % MaxSize==Front; /// <summary>
/// 判断队列是否为空;当队列首==队列尾 首尾相等
/// </summary>
/// <returns></returns>
public bool IsEmpty() => Front == Rear; public void AddQueue(int value)
{
if (IsFull()) Console.WriteLine("队列已满!不能再添加数据");
else
{
//直接将数据加入
Arr[Rear] = value;
//将队列尾部后移一个位置,因为是环形数组队列要考虑取模
Rear = (Rear + ) % MaxSize;
}
} public void ShowQueue()
{
if (IsEmpty()) Console.WriteLine("队列为空!没有数据");
else
{
//从Front开始遍历
for (int i = Front; i < Front+Size(); i++)
{
Console.WriteLine($"Arr[{i%MaxSize}]={Arr[i%MaxSize]}");
}
}
} /// <summary>
/// 队列尾 + 最大值 - 队列首 % 最大值
/// </summary>
/// <returns></returns>
public int Size() => (Rear + MaxSize-Front) % MaxSize; /// <summary>
/// 取出队列数据
/// </summary>
/// <returns></returns>
public int GetQueue()
{
if (IsEmpty()) throw new Exception("队列为空!没有数据");
//1.先把Front对应的值保留到一个临时变量
//2.重新分配Front的值,将Front后移,要考虑取模
//3.将临时变量返回
var val = Arr[Front];
Front = (Front + ) % MaxSize;
return val;
} public int HeadQueue()
{
if (IsEmpty()) throw new Exception("队列为空!没有数据");
//直接返回头元素
return Arr[Front];
} public static void Test()
{
CircleArrayQueue queue = new CircleArrayQueue();
string key = "";
bool loop = true;
while (loop)
{
Console.WriteLine("s(show):显示队列");
Console.WriteLine("e(exit):退出程序");
Console.WriteLine("a(add):添加数据到队列队列");
Console.WriteLine("g(get):从队列中取出数据");
Console.WriteLine("h(head):查看队列头部的数据");
key = Console.ReadLine();
switch (key)
{
case "s":
queue.ShowQueue();
break;
case "a":
Console.WriteLine("请输入一个值");
int.TryParse(Console.ReadLine(), out int value);
queue.AddQueue(value);
break;
case "g":
try
{
int reuslt = queue.GetQueue();
Console.WriteLine("取出来的数据:" + reuslt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
break;
case "h":
try
{
int reuslt = queue.HeadQueue();
Console.WriteLine("队列头的数据:" + reuslt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
break;
case "e":
loop = false;
break;
default:
break;
}
}
Console.WriteLine("程序退出");
} }
4.测试结果

C#数据结构与算法系列(三):队列的更多相关文章
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈
定场诗 金山竹影几千秋,云索高飞水自流: 万里长江飘玉带,一轮银月滚金球. 远自湖北三千里,近到江南十六州: 美景一时观不透,天缘有分画中游. 前言 本章是重读<学习JavaScript数据结构 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- 数据结构与算法Java描述 队列
package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...
- Java数据结构和算法(三)顺序存储的树结构
Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- 【学习总结】java数据结构和算法-第三章-稀疏数组和队列
相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...
随机推荐
- jdk1.8的一些特性
一.jdk1.8的特性: Lambda表达式 函数式接口 方法引用 接口的默认方法和静态方法 Optional Streams 并行数组 新时间日期API 二.Lambda表达式: Lambda 表达 ...
- PAT-1064 Complete Binary Search Tree(完全二叉树)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 玩转java反射
玩玩JAVA反射 什么是反射 Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任何一个方法和属性:这样动态获取新的以及动态调用对象的方法 ...
- 【Redis】List常见应用场景
常用数据结构 Stack(栈) = LPUSH + LPOP ->FILO Queue(队列) = LPUSH + RPOP Blocking MQ(阻塞队列) = LPUSH + BRPOP ...
- mybatis的一堆多映射使用配置
自己仿站jeep官网在制作商城时,商品详情页面需要带着一个商品的信息,商品的配置,配置对应的颜色,商品的图片 如图 首先设计业务bean 一辆车的信息 业务一对多的大业务bean,继承Car.ja ...
- vue展开过度动画
有一段时间没用vue动画了,就忘了,又仔细去看了vue官网 的过渡&动画,记录下来方便快速使用 (可以多看vue官网 过渡&动画 实现更多效果) 1.实际效果 展开收起效果.gif 2 ...
- 在树莓派里搭建 Lighttpd 服务器
Lighttpd 像 Ngnix 一样,是被设计运行在低内存,低 CPU 负载的设备上,它们都非常适合在树莓派上运行. 本文将介绍如何在树莓派上运行基本配置的 Lighttpd ,以及如何与 PHP- ...
- [PHP学习教程 - 日期/时间]001.月份第一天&最后一天(Month First Day & Last Day)
引言:在时间处理上,对于前/后台人性化的展示当前月份最大天数,这个是网站必须要处理的一个方面.但通常这一块会由第三方类库直接包装,这里我们做一个简单的Mark. 今天,我们就为大家提供一个函数,获得指 ...
- [PHP自动化-进阶]001.CURL模拟登录并采集数据
引言:PHP可以通过libcurl实现模拟登录,提交数据,违法乱纪,烧杀抢虐等等事项. 简单说明一下"libcurl",补一下脑: libcurl目前支持http.https.ft ...
- MvvmLight + Microsoft.Extensions.DependencyInjection + WpfApp(.NetCore3.1)
git clone MvvmLight失败,破网络, 就没有直接修改源码的方式来使用了 Nuget安装MvvmLightLibsStd10 使用GalaSoft.MvvmLight.Command命名 ...