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#数据结构与算法系列(三):队列的更多相关文章

  1. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  2. 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列

    定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...

  3. 重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈

    定场诗 金山竹影几千秋,云索高飞水自流: 万里长江飘玉带,一轮银月滚金球. 远自湖北三千里,近到江南十六州: 美景一时观不透,天缘有分画中游. 前言 本章是重读<学习JavaScript数据结构 ...

  4. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  5. 数据结构与算法Java描述 队列

    package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...

  6. Java数据结构和算法(三)顺序存储的树结构

    Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...

  7. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  8. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...

  9. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  10. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

随机推荐

  1. etcd分布式锁及事务

    前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互 ...

  2. BZOJ1059 二分匹配

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4810  Solved: 2297[Submit][Stat ...

  3. A == B ?(hdu2054)

    输入格式:直接循环,同时输入两个不带空格未知长度的字符串. 思考:不带空格未知长度且同时输入,用两个char s[maxsize]定义两个字符数组,再用scanf_s()函数同时输入两个字符串. 注意 ...

  4. JavaScript编程入门

    写在前面: 不管容易还是简单 总要尝试才知道答案     1.JavaScript初探   JavaScript:轻量级脚本语言,是可插入HTML页面的编程代码. 将JavaScript插入HTML页 ...

  5. (二)vue的生命周期及相关的运行流程

    @ 目录 1. vue的生命周期 经过一系列的初始化过程 需要设置数据监听 编译模板 将实例花在到DOM 并在数据变化时更新DOM 等 这是相应的生命周期函数 在用的时候直接写上, 其实很多人都这样, ...

  6. js上拉刷新数据

    $(window).scroll(function () { //下面这句主要是获取网页的总高度,主要是考虑兼容性所以把Ie支持的documentElement也写了,这个方法至少支持IE8 var ...

  7. IO流基础,创建File对象与方法是用

    1.io流主要用途读取本地文件或服务器文件,进行本地或者服务器开呗工作 构造函数   绝对路径够构造方法:    File f = new File("D:\\test\\a.txt&quo ...

  8. web自动化之iframe操作

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  9. [安全] HTTPS的理解

    一.概述 在下面的章节,我们要搞明白以下几个问题: HTTP和HTTPS的区别,为什么要使用HTTPS HTTPS如何解决加密问题 HTTPS如何避免中间人攻击 CA证书是什么 CA证书是如何申请和颁 ...

  10. Java面向对象 类与对象与方法的储存情况

    栈.堆.方法区 类(含方法)储存在方法区 main函数入栈 堆里面存储方法区中类与方法的地址 main函数调用方法,找堆里面方法的地址,再从方法区找到对应函数,函数入栈,用完出栈 总结: 1.类.方法 ...