一、Queue类:队列

Queue (队列) 是常见的数据结构之一。

队列是一种先进先出的结构,即元素从队列尾部插入,从队列的头部移除,类似于日常生活中的站队,先到先得的效果。
    集合中的 Queue 类模拟了队列操作,提供了队列中常用的属性和方法。
    Queue 类提供了 4 个构造方法,如下表所示。

构造方法 作用
Queue() 创建 Queue 的实例,集合的容量是默认初始容量 32 个元素,使用默认的增长因子
Queue(ICollection col) 创建 Queue 的实例,该实例包含从指定实例中复制的元素,并且初始容量与复制的元素个数、增长因子相同
Queue(int capacity)  创建 Queue 的实例,并设置其指定的元素个数,默认增长因子
Queue(int capacity, float growFactor) 创建 Queue 的实例,并设置其指定的元素个数和增长因子

增长因子是指当需要扩大容量时,以当前的容量(capacity)值乘以增长因子(growFactor)的值来自动增加容量。
    下面使用上表中的构造方法来创建 Queue 的实例,代码如下。

//第 1 中构造器Queue queueq1 = new Queue();//第 2 中构造器Queue queueq2 = new Queue(queue1);//第 3 中构造器Queue queueq3 = new Queue(30);//第 4 中构造器Queue queueq4 = new Queue(30, 2);

与上一节《C# ArrayList》中介绍的 ArrayList 类不同,Queue 类不能在创建实例时直接添加值。

Queue类中常用的属性和方法如下表所示。

属性或方法 作用
Count 属性,获取 Queue 实例中包含的元素个数
void Clear()  清除 Queue 实例中的元素
bool Contains(object obj) 判断 Queue 实例中是否含有 obj 元素
void CopyTo(Array array, int index)  将 array 数组从指定索引处的元素开始复制到 Queue 实例中
object Dequeue() 移除并返回位于 Queue 实例开始处的对象
void Enqueue(object obj) 将对象添加到 Queue 实例的结尾处
object Peek()  返回位于 Queue 实例开始处的对象但不将其移除
object[] ToArray() 将 Queue 实例中的元素复制到新数组
void TrimToSize()  将容量设置为 Queue 实例中元素的实际数目
IEnumerator GetEnumerator()  返回循环访问 Queue 实例的枚举数

(总之就是创建了一个内存空间,类似一个数值,并且默认长度是32。)

(然后存储方式就像排队一样,从尾部存入,从头部取出使用并移除。中间部分不能进行修改使用。)

再然后就是一些方法和属性的使用。

1.例

创建 Queue 类的实例,模拟排队购电影票的操作。

根据题目要求,先向队列中加入 3 个元素,然后再依次购票。

实现代码如下。

class Program{    static void Main(string[] args){        Queue queue = new Queue();        //向队列中加入3为购票人        queue.Enqueue("小张");        queue.Enqueue("小李");        queue.Enqueue("小刘");        Console.WriteLine("购票开始:");        //当队列中没有人时购票结束        while (queue.Count != 0)        {            Console.WriteLine(queue.Dequeue() + "已购票!");        }        Console.WriteLine("购票结束!");    }}

分析:

首先创建一个Queue 类的队列实例。

然后通过Enqueue方法追加数据。

然后通过while循环,进行判断循环。

Count属性,表示实例中是否存在着元素,也就是队列的长度。

而且从这里来看,如果什么也不存,默认就是0.

存1个就是1,再存1个就是2.

上面存了3个,也就是queue.Count=3.

queue.Dequeue();取出队列里的元素。

并且每取出一个,队列里的长度就减1,而且取出的数据也脱离队列,从队列中剔除。

然后再输出一个最后的结果。

运行结果:

从上面的执行效果可以看出,在从队列中取值时与存入队列中的值顺序是相同的。

2.例

向 Queue 类的实例中添加 3 个值,在不移除队列中元素的前提下将队列中的元素依次输出。

根据题目要求,可以使用 ToArray() 方法将 Queue 类的实例中存放的值复制到数组后再遍历数组。

实现的代码如下。

class Program{    static void Main(string[] args){        Queue queue = new Queue();        queue.Enqueue("aaa");        queue.Enqueue("bbb");        queue.Enqueue("ccc");        object[] obj = queue.ToArray();        foreach(var v in obj)        {            Console.WriteLine(v);        }    }}

分析:

创建一个队列实例。

然后往队列中存入3个元素。

然后第9行,将队列复制到Object类型的数组中。

.ToArray()方法,将队列变成数组,并赋值到Object类型的数组变量中。

然后就直接通过foreach进行数组遍历。

队列,就像排队一样。先存入的,就会先输出。(毕竟不允许插队!)

3.例

除了使用 ToArray() 方法以外,还可以使用 GetEnumerator() 方法来遍历,实现的代码如下。

class Program{    static void Main(string[] args){        Queue queue = new Queue();        queue.Enqueue("aaa");        queue.Enqueue("bbb");        queue.Enqueue("ccc");        IEnumerator enumerator = queue.GetEnumerator();        while (enumerator.MoveNext())        {            Console.WriteLine(enumerator.Current);        }    }}

分析:

同样定义了一个队列,并存入3个元素。

然后又定义了一个IEnumerator类型变量,应该是一个接口。

queue.GetEnumerator()返回循环访问 Queue 实例的枚举数。

通过while循环;

enumerator.MoveNext()返回的是true。

应该是enumerator变量内存在元素,就是true。

enumerator.Current:则是将元素里的元素取出。

9~13行,已经属于固定搭配吧!

效果与使用 ToArray() 所示的效果相同。在实际应用中,我们可以自由选择上面两种方法。

二、Stack类:堆栈

Stack (栈)是常见的数据结构之一,栈是一种先进后出的结构,即元素从栈的尾部插入,从栈的尾部移除,类似于日常生活中搬家的时候装车,先装上车的东西要后拿下来。
    集合中的 Stack 类模拟了栈操作,提供了栈中常用的属性和方法。
    Stack 类提供了 3 种构造方法,如下表所示。

构造方法 作用
Stack() 使用初始容量创建 Stack 的对象
Stack(ICollection col)  创建 Stack 的实例,该实例包含从指定实例中复制的元素,并且初始容量与复制的元素个数、增长因子相同
Stack(int capacity) 创建 Stack 的实例,并设置其初始容量

Stack 类中的常用属性和方法如下表所示。

属性或方法 作用
Push(object obj) 向栈中添加元素,也称入栈
object Peek() 用于获取栈顶元素的值,但不移除栈顶元素的值
object Pop() 用于移除栈顶元素的值,并移除栈顶元素
Clear() 从 Stack 中移除所有的元素
Contains(object obj) 判断某个元素是否在 Stack 中
object[] ToArray() 复制 Stack 到一个新的数组中

(总之,堆栈就像是干草堆,或者说是枪战片里给弹匣压子弹。)

(每存一个元素,就会在数据的最顶端,使用时也会从最顶端的元素进行取出使用,并脱离这个堆栈。)

(还真像压子弹一样,压完后上膛,射出的子弹就是最后压上前的那个。)

堆栈的特性是,后存入的元素,被使用时会先调用。

1.例

下面通过实例来演示 Stack 类的使用。

创建一个栈(Stack),模拟餐馆盘子的存取。

根据题目要求,先在栈中按顺序放置 5 个盘子,再将所有盘子取出,取盘子时应先取最上面的盘子,与栈的存取原理一致。具体的代码如下。

class Program{    static void Main(string[] args){        Stack stack = new Stack();        //向栈中存放元素        stack.Push("1 号盘子");        stack.Push("2 号盘子");        stack.Push("3 号盘子");        stack.Push("4 号盘子");        stack.Push("5 号盘子");        Console.WriteLine("取出盘子:");        //判断栈中是否有元素        while(stack.Count != 0)        {            //取出栈中的元素            Console.WriteLine(stack.Pop());        }    }}

分析:

创建一个堆栈。

Push()方法,就是往里面存储元素,压栈,压子弹。

然后通过while循环语句进行循环遍历。

Count属性,是计算堆栈里面的个数。

如果不等于0,就循环。

Pop()方法,表示取出堆栈里面的元素,出栈,射子弹。

运行结果:

可以看出,先存入的数据元素,反而会被最后输出。

就像弹匣那样,上子弹时,先放入的子弹在最底下,而打枪时,先射出的则是最后存入的那个子弹。

三、Hashtable类:哈希表(散列表)

Hashtable 类实现了 IDictionary 接口,集合中的值都是以键值对的形式存取的。
    C# 中的 Hashtable 称为哈希表,也称为散列表,在该集合中使用键值对(key/value)的形式存放值。
    换句话说,在 Hashtable 中存放了两个数组,一个数组用于存放 key 值,一个数组用于存放 value 值。
    此外,还提供了根据集合中元素的 key 值查找其对应的 value 值的方法。

Hashtable 类提供的构造方法有很多,最常用的是不含参数的构造方法,即通过如下代码来实例化 Hashtable 类。

Hashtable 对象名 = new Hashtable ();

Hashtable 类中常用的属性和方法如下表所示。

属性或方法 作用
Count 集合中存放的元素的实际个数
void Add(object key,object value) 向集合中添加元素
void Remove(object key) 根据指定的 key 值移除对应的集合元素
void Clear() 清空集合
ContainsKey (object key) 判断集合中是否包含指定 key 值的元素
ContainsValue(object value) 判断集合中是否包含指定 value 值的元素

(总之,是一个类似键值对的数据类型。)

类似a{“a”:“aa”,“b”:“bb”,“c”:“cc”‍}这样的形式。

1.例

使用 Hashtable 集合实现图书信息的添加、查找以及遍历的操作。

根据题目要求,先向 Hashtable 集合中添加 3 个值,再根据所输入的 key 值查找图书名称,最后遍历所有的图书信息,代码如下。

class Program{    static void Main(string[] args)    {        Hashtable ht = new Hashtable();        ht.Add(1, "计算机基础");        ht.Add(2, "C#高级编程");        ht.Add(3, "数据库应用");        Console.WriteLine("请输入图书编号");        int id = int.Parse(Console.ReadLine());        bool flag = ht.ContainsKey(id);        if (flag)        {            Console.WriteLine("您查找的图书名称为:{0}", ht[id].ToString());        }        else        {            Console.WriteLine("您查找的图书编号不存在!");        }        Console.WriteLine("所有的图书信息如下:");        foreach(DictionaryEntry d in ht)        {            int key = (int)d.Key;            string value = d.Value.ToString();            Console.WriteLine("图书编号:{0},图书名称:{1}", key, value);        }    }}

分析:

首先定义一个哈希类。

然后添加元素。

Add()方法,则是添加元素的方法。

第一个参数是,键key;

第二个参数是,值value。

第10行,是手动输入一个int类型的数,也就是id号。

其实也就是哈希类中的键。

第11行,

ht.ContainsKey(id);判断集合中是否包含指定 key 值的元素。

12~15行,

因为11行返回的是一个布尔值。

所以在12行进行if语句判断。

ht[id].ToString();

首先是ht[id],表示取出id键的值元素。

ht是哈希类型的变量,里面存着键值对的数据。

id是哈希数据里的键key,也就相当于数组中的元素下标。

.ToString()方法,是将取出来的元素变成字符串类型。

如果if语句为假,就输出"您查找的图书编号不存在!"。

21~26行

遍历哈希类型里面的数据。

由此可以看出,哈希类的数据类型是DictionaryEntry。

然后强行把键key的类型转换成int类型,也是值类型。

哈希类的值数据value,通过 .ToString()方法转换成了字符串,也就是引用类型。

然后结合foreach循环输出。

从上面的执行效果可以看出,在使用 Hashtable 时能同时存放 key/value 的键值对,由于 key 值是唯一的,因此可以根据指定的 key 值查找 value 值。

并且输出遍历的方式,是堆栈的形式。

四、SortedList类:有序列表

SortedList 类实现了 IDictionary 接口 ,集合中的值都是以键值对的形式存取的。
    C# SortedList 称为有序列表,按照 key 值对集合中的元素排序。
    SortedList 集合中所使用的属性和方法与上一节《C# Hashtable》中介绍的 Hashtable 比较类似,这里不再赘述。

1.例

使用 SortedList 实现挂号信息的添加、查找以及遍历操作。

根据题目要求,向 SortedList 集合中添加 3 位挂号信息(挂号编号、姓名),并根据患者编号查找患者姓名,遍历所有的挂号信息。具体的代码如下。

class Program{    static void Main(string[] args)    {        SortedList sortList = new SortedList();        sortList.Add(1, "小张");        sortList.Add(2, "小李");        sortList.Add(3, "小刘");        Console.WriteLine("请输入挂号编号:");        int id = int.Parse(Console.ReadLine());        bool flag = sortList.ContainsKey(id);        if (flag)        {            string name = sortList[id].ToString();            Console.WriteLine("您查找的患者姓名为:{0}", name);        }        else        {            Console.WriteLine("您查找的挂号编号不存在!");        }        Console.WriteLine("所有的挂号信息如下:");        foreach(DictionaryEntry d in sortList)        {            int key = (int)d.Key;            string value = d.Value.ToString();            Console.WriteLine("挂号编号:{0},姓名:{1}", key, value);        }    }}

分析:

定义了一个有序列表实例。

然后通过Add进行存入数据。键值对的方式存储。

同样通过手动输入一个键名来匹配有序列表中存不存在。

再通过if语句进行判断输出。

再最后通过foreach遍历输出。

一样是DictionaryEntry类型,所以必须将键id强制转换成int类型,值数据Value强制转换成字符串类型。

运行结果:

从上面的执行效果可以看出,SortedList 集合中的元素是按 key 值的顺序排序的。

而这种遍历输出的方式,跟队列的方式一样。

C# 数组增加元素_【自学C#】|| 笔记 21 集合续,队列和堆栈相关推荐

  1. es6 数组找最大值_自学Java笔记_day04_第四章 数组

    4.1 数组的相关概念和名词(了解) 1.数组(array): ​ 一组具有相同数据类型的数据的按照一定顺序排列的集合. ​ 把有限的几个相同类型的变量使用一个名称来进行统一管理. 2.数组名: ​ ...

  2. C# 数组增加元素_C#的集合类型及使用技巧

    在日常开发过程中,我们不能避免的要对批量数据处理,这时候就要用到集合.集合总体上分为线性集合和非线性集合.线性集合是指元素具有唯一的前驱和后驱的数据结构类型:非线性集合是指有多个前驱和后驱的数据结构类 ...

  3. python中词云pic_path是什么_自学Python笔记:打造我的第一个词云

    原标题:自学Python笔记:打造我的第一个词云 两会词云 "词云"是对文本中出现频率较高的"关键词"予以视觉上的突出,形成"关键词云层"或 ...

  4. scala 获取数组中元素_从Scala中的元素列表中获取随机元素

    scala 获取数组中元素 We can access a random element from a list in Scala using the random variable. To use ...

  5. python微信公众号翻译功能_自学Python笔记:给微信公众号搭建“成绩查询”功能...

    原标题:自学Python笔记:给微信公众号搭建"成绩查询"功能 期末考试 临近年末,全国各地都在上演一场大戏<期末考试>,考完试无论什么样的结果总想尽快看到自己一个学期 ...

  6. python中成绩分析函数_自学Python笔记:用Python做成绩分析(1)

    有朋友会问,刚学了一周,什么是面向对象都还不清楚就可以写程序?还有Python不是写"爬虫"吗? Python是面向对象的语言,函数.模块.数字.字符串都是对象,并且完全支持继承. ...

  7. C# 数组增加元素_C语言数组——任意位置插入一个元素

    前言 接着昨天的话题,我们再来看看向C语言的数组中随机插入一个元素的方法. 如果是在python向列表中随机添加元素,我们往往使用insert()的方法. l insert()的第一个参数是位置,第二 ...

  8. dataframe数组做元素_数组 array 矩阵 list 数据框 dataframe

    #R语言备忘录三# #数组array和矩阵matrix.列表list.数据框dataframe #数组 #数组的重要属性就是dim,维数 #得到4*5的矩阵 z dim(z) z #构建数组 x #三 ...

  9. dataframe数组做元素_大数据技术之使用 DataFrame 读取复杂 JSON 中的嵌套数组

    本篇教程探讨了大数据技术之使用 DataFrame 读取复杂 JSON 中的嵌套数组,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入. 众所周知,在早期Spark版本中就已经支持 ...

最新文章

  1. 深入DataGrid分页样式实例
  2. NYOJ 311 完全背包
  3. Angular Injector.create的工作原理
  4. lightoj 1031 区间dp
  5. 小程序引用其他页面js_来聊聊小程序页面之间如何通信
  6. C++字符串完全指南(2) - 各种字符串类- CRT类
  7. CWE视图层级关系解析:节点关系查询
  8. Python之logging模块
  9. OpenCV图像处理基础操作(4)
  10. 阿里云数据传输服务低价不低质,服务再升级 1
  11. python ddos_python 检查是否存在ddos攻击
  12. android端使用mockServer
  13. iOS popViewController 失败
  14. java 对战平台-魔兽版
  15. sicily 1691 Abundance
  16. 今天距离2022年除夕还有多少天?春节放假倒计时在手机便签上提醒
  17. 零基础学日语资料附经验分享
  18. Typora使用详解
  19. java闲鱼支付系统_闲鱼: 多状态多操作的交易链路架构演进
  20. axis=1和axis=0的区别

热门文章

  1. MAYA基础知识和技巧总结
  2. h5页面后退苹果手机出现白屏
  3. Bugku CTF 密码学刷题
  4. MySQL 嵌套子查询 with子句 from子查询 in子查询 join子查询
  5. 解决WPS图片格式粘贴后消失的问题
  6. java 集成小米,华为推送
  7. 双项荣耀|海泰方圆斩获第二届密码丰会“成长力企业奖”“创新力企业奖”
  8. python递归判断回文数_Python实现判断回文数算法
  9. Mac 下必备高效率软件与插件,值得拥有。
  10. 不是我们选择了年龄焦虑,是大厂焦虑了我们