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. GYM101635E Ingredients

    题目链接:https://vjudge.net/problem/Gym-101635E 题目大意: 给定一个有 \(N\) 条边的有向无环图(有多个起点),每条边都有其费用和收益,现要从一个或多个起点 ...

  2. 四、HTML属性—— HTML 元素提供的附加信息

    HTML属性 (1)属性一般描述于开始标签 (2)属性总是以名称/值对的形式出现,比如:name="value" (3)使用小写属性 HTML属性值 应该始终被包括在引号内. —— ...

  3. dubbo分布式应用

    dubbo介绍: dubbo是一款分布式服务框架,支持高性能和透明化的RPC远程服务调用方案,每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中. ...

  4. poi——读取excel数据

    单元格类型 读取Excel数据 package com.java.test.poi; import java.io.File; import java.io.FileInputStream; impo ...

  5. 补充_001_问题_001_Vivian

    在此先向前辈们和同学们道个歉,一是没有认真地专研前辈们的精文,二是对一些读者造成了一定程度上的困扰,为此鄙人深感抱歉,现在对"问题_001_Vivian"中不严谨的地方进行修改: ...

  6. 【转】团队项目的Git分支管理规范

    原文地址: http://blog.jboost.cn/git-branch.html 分支管理 创建项目时(一般是服务型项目,工具型或辅助型项目可以简单一些),会针对不同环境创建三个常设分支: de ...

  7. 第7章 PCA与梯度上升法

    主成分分析法:主要作用是降维 疑似右侧比较好? 第三种降维方式: 问题:????? 方差:描述样本整体分布的疏密的指标,方差越大,样本之间越稀疏:越小,越密集 第一步: 总结: 问题:????怎样使其 ...

  8. protocbuf的简单理解

    之前通信协议替换为protocbuf!新老交替,很多不同看法,也提出来一些负面因数: 1.老的内部通信协议体已经有一段时间了,稳定熟悉! 2.通过通信结构体进行交互,实际上并没有序列化和反序列化的过程 ...

  9. python调用大漠插件教程03窗口绑定实例

    怎样利用注册好的大漠对象来绑定窗口? 直接上代码,根据代码分析 from win32com.client import Dispatch import os from win32gui import ...

  10. VUE 子组件向父组件传值 , 并且触发父组件方法(函数)

    目标:封装一个  搜索组件 <子组件需要传一个或者多个搜索参数到父组件,然后父组件执行列表查询函数> 1.子组件 <div> <input v-model="l ...