4.Queue

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

×

喜欢就点赞,疼爱就打赏