4.简单数据结构类-Queue
4.1 知识点
Queue的本质
Queue(队列)是一个C#为我们封装好的类,它的本质也是object[]
数组,只是封装了特殊的存储规则。
Queue是队列存储容器,队列是一种先进先出的数据结构,即先存入的数据先获取,后存入的数据后获取。
Queue的申明
需要引用命名空间 System.Collections
。
Queue queue = new Queue();
Queue的增取查改和遍历
增
当前queue
中的元素有:
{}
Enqueue方法:传入元素直接让元素入队。
queue.Enqueue(1);
queue.Enqueue("123");
queue.Enqueue(1.4f);
queue.Enqueue(new Test());
增完之后queue
中的元素有:
{ 1, 123, 1.4f, Lesson03_Queue.Test }
取
当前queue
中的元素有:
{ 1, 123, 1.4f, Lesson03_Queue.Test }
队列中不存在删除的概念,只有取的概念,取出先加入的对象。
Dequeue方法:取出队首元素。
object v = queue.Dequeue();
Console.WriteLine(v); // 1
v = queue.Dequeue();
Console.WriteLine(v); // 123
取完之后queue
中的元素有:
{ 1.4f, Lesson03_Queue.Test }
查
当前queue
中的元素有:
{ 1.4f, Lesson03_Queue.Test }
Peek方法:查看队首元素。队列无法查看指定位置的元素,只能查看队首元素。
// Peek方法只会查看队首元素,不会移除队首元素
v = queue.Peek();
Console.WriteLine(v); // 1.4
Contains方法:传入元素,查看元素是否存在于队列中。存在返回true
,否则返回false
。
if (queue.Contains(1.4f))
{
Console.WriteLine("队列中存在1.4f"); // 队列中存在1.4f
}
改
当前queue
中的元素有:
{ 1.4f, Lesson03_Queue.Test }
队列无法改变其中的元素,只能进出队列。如果实在要改,只有清空。
Clear方法:清空队列中所有元素。
// queue.Clear(); // 会清空队列,为后面方便演示,注释
遍历
当前queue
中的元素有:
{ 1.4f, Lesson03_Queue.Test }
Count属性:返回队列的长度。
Console.WriteLine(queue.Count); // 2
foreach遍历队列:
用foreach
遍历遍历出来的顺序也是从队首到队尾。队列不能直接通过for
循环遍历,因为队列没有提供索引器通过[]
访问。
foreach (object item in queue)
{
Console.WriteLine(item);
// 打印的顺序如下,队首到队尾
// 1.4
// Lesson03_Queue.Test
}
ToArray方法:将队列转换为object
数组,再用for
循环遍历。
// 遍历出来的顺序也是从队首到队尾
object[] array = queue.ToArray();
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
// 打印的顺序如下,队首到队尾
// 1.4
// Lesson03_Queue.Test
}
Console.WriteLine(queue.Count); // 队列的长度仍然是2,不被影响
while循环出队:每次循环弹出队首元素。
while (queue.Count > 0)
{
object o = queue.Dequeue();
Console.WriteLine(o);
// 打印的顺序如下,队首到队尾
// 1.4
// Lesson03_Queue.Test
}
Console.WriteLine(queue.Count); // 队列的长度变为0,队列空
Queue的装箱拆箱
由于用object
来存储数据,自然存在装箱拆箱。当往其中进行值类型存储时就是在装箱,当将值类型对象取出来转换使用时,就存在拆箱。
4.2 知识点代码
using System;
using System.Collections;
namespace Lesson03_Queue
{
class Test
{
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Queue");
#region 知识点一 Queue的本质
//Queue是一个C#为我们封装好的类
//它的本质也是object[]数组,只是封装了特殊的存储规则
//Queue是队列存储容器
//队列是一种先进先出的数据结构
//先存入的数据先获取,后存入的数据后获取
//先进先出
#endregion
//主函数内
#region 知识点二 Queue的申明
//需要引用命名空间 System.Collections
Queue queue = new Queue();
#endregion
#region 知识点三 Queue的增取查改和遍历
#region 增
//当前queue中的元素有
//{}
//Enqueue方法 传入元素直接让元素入队
queue.Enqueue(1);
queue.Enqueue("123");
queue.Enqueue(1.4f);
queue.Enqueue(new Test());
//增完之后queue中的元素有
//{ 1,123,1.4f,Lesson03_Queue.Test}
#endregion
#region 取
//当前queue中的元素有
//{ 1,123,1.4f,Lesson03_Queue.Test}
//队列中不存在删除的概念
//只有取的概念 取出先加入的对象
//Dequeue方法 取出队首元素
object v = queue.Dequeue();
Console.WriteLine(v);//1
v = queue.Dequeue();
Console.WriteLine(v);//123
//取完之后queue中的元素有
//{1.4f,Lesson03_Queue.Test}
#endregion
#region 查
//当前queue中的元素有
//{1.4f,Lesson03_Queue.Test}
//Peek方法 查看队首元素
//队列无法查看指定位置的元素 只能查看队首元素
v = queue.Peek();
Console.WriteLine(v);//1.4
//查看队列头部元素 但不会移除队首元素
v = queue.Peek();
Console.WriteLine(v);//1.4
//Contains方法 传入元素 查看元素是否存在于队列中 存在返回true 否则返回false
if (queue.Contains(1.4f))
{
Console.WriteLine("队列中存在1.4f");//队列中存在1.4f
}
#endregion
#region 改
//当前queue中的元素有
//{1.4f,Lesson03_Queue.Test}
//队列无法改变其中的元素 只能进出队列 实在要改 只有清空
//Clear方法 清空队列中所有元素
//queue.Clear();//会清空队列 为后面方便演示 注释
#endregion
#region 遍历
//当前queue中的元素有
//{1.4f,Lesson03_Queue.Test}
//1.Count属性 返回队列的长度
Console.WriteLine(queue.Count);//2
//2.foreach遍历队列
//用foreach遍历遍历出来的顺序 也是从队首到队尾
//队列不能直接通过for循环遍历 因为队列没有提供索引器通过[]访问
foreach (object item in queue)
{
Console.WriteLine(item);
//打印的顺序如下 队首到队尾
//1.4
//Lesson03_Queue.Test
}
//3.ToArray方法 将队列转换为object数组 再用for循坏遍历
//遍历出来的顺序 也是从队首到队尾
object[] array = queue.ToArray();
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
//打印的顺序如下 队首到队尾
//1.4
//Lesson03_Queue.Test
}
Console.WriteLine(queue.Count);//队列的长度仍然是2 不被影响
//4.while循环出队 每次循环弹出队首元素
while (queue.Count > 0)
{
object o = queue.Dequeue();
Console.WriteLine(o);
//打印的顺序如下 队首到队尾
//1.4
//Lesson03_Queue.Test
}
Console.WriteLine(queue.Count);//队列的长度变为0 队列空
#endregion
#endregion
#region 知识点四 Queue的装箱拆箱
//由于用万物之父来存储数据,自然存在装箱拆箱。
//当往其中进行值类型存储时就是在装箱
//当将值类型对象取出来转换使用时,就存在拆箱。
#endregion
}
}
}
4.3 练习题
请简述队列的存储规则
- 队列是一种先进先出(FIFO,First In First Out)的数据结构,即最先进入队列的元素最先被取出。
- 队列的存储规则是先进先出,最先添加的元素在队列的前面,而最后添加的元素在队列的后面。
使用队列存储消息,一次性存10条消息,每隔一段时间打印一条消息,控制台打印消息时要有明显停顿感
主函数内
// 新建一个队列,加入一些元素
Queue queue = new Queue();
queue.Enqueue("获得10枚金币");
queue.Enqueue("获得屠龙刀x1");
queue.Enqueue("获得99枚金币");
queue.Enqueue("获得血瓶x1");
queue.Enqueue("获得85枚金币");
queue.Enqueue("获得11枚金币");
queue.Enqueue("获得2枚金币");
queue.Enqueue("获得91枚金币");
queue.Enqueue("获得73枚金币");
queue.Enqueue("获得645枚金币");
// 模仿贪吃蛇的做法,计算循环次数,达到一定次数后执行逻辑
int whileLoopTimes = 1;
while (true)
{
// 每当循环次数达到一定值时打印消息
if (whileLoopTimes % 99999999 == 0)
{
// 如果队列中有元素,则打印并移除队首元素
if (queue.Count > 0)
{
Console.WriteLine(queue.Dequeue());
}
// 每次打印后,重置循环次数
whileLoopTimes = 0;
// 添加停顿感,让消息打印的间隔更明显
System.Threading.Thread.Sleep(1000); // 1000毫秒 = 1秒
}
++whileLoopTimes;
}
4.4 练习题代码
using System;
using System.Collections;
namespace Lesson03_练习题
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Queue练习题");
#region 练习题一
//请简述队列的存储规则
//先进先出
#endregion
//主函数内
#region 练习题二
//使用队列存储消息,一次性存10条消息,每隔一段时间打印一条消息
//控制台打印消息时要有明显停顿感
//new出一个队列 加入一些元素
Queue queue = new Queue();
queue.Enqueue("获得10枚金币");
queue.Enqueue("获得屠龙刀x1");
queue.Enqueue("获得99枚金币");
queue.Enqueue("获得血瓶x1");
queue.Enqueue("获得85枚金币");
queue.Enqueue("获得11枚金币");
queue.Enqueue("获得2枚金币");
queue.Enqueue("获得91枚金币");
queue.Enqueue("获得73枚金币");
queue.Enqueue("获得645枚金币");
//模仿贪吃蛇的做法 计算循环次数 达到一定次数后走逻辑
int whileLoopTimes = 1;
while (true)
{
//while循环99999999次后才输出一次
if (whileLoopTimes % 99999999 == 0)
{
//队列有元素才打印
if (queue.Count > 0)
{
Console.WriteLine(queue.Dequeue());
}
//打印一次循环次数重置
whileLoopTimes = 0;
}
++whileLoopTimes;
}
#endregion
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com