‫在本视频中, 我们将介绍提示, 并了解如何在应用程序中使用队列｡
‫队列很重要, 我们的操作系统经常使用队列, 例如, 处理任务､
‫调度和许多其他进程｡
‫当数据的顺序很重要时, 应该使用队列, 正如我们将在示例中看到的那样｡
‫我们先来定义一个队列｡
‫为了定义队列, 您可以使用队列｡
‫关键字队列也是泛型集合的一部分, 这意味着我们需要定义队列将包含什么类型｡
‫在这种情况下, 它将保存一组整数, 但也可以保存任何其他类型.
‫它可以装弦, 甚至可以装一个完整的物体｡
‫因此, 您可以完全自由地定义您希望此项目保存的任何内容｡
‫所以队列的名字是"小", 然后符号变成"大", 然后队列的名字是"等于".
‫然后你可以直接初始化它, 就像我们在这里做的, 我们只是创建一个空的队列来保存整数｡
‫现在, 我们可以继续向此队列添加项目｡
‫为了将项目添加到队列中, 可以使用结束队列方法｡
‫queue方法会将物件加入至队列的结尾｡
‫例如, 如果我添加一个类似的项目, 这个项目将是第一个, 因为它是我们包括的第一个项目,
‫但它也将是最后一个项目｡
‫因此, 只要我们添加另一个, 新的项目将是队列中的最后一个项目｡
‫这就是点菜的方式｡
‫它类似于堆栈, 但不同的是当你删除某个东西时, 队列,
‫所以当你弹出一个项目时, 它会从队列的开头取出它.
‫因此, 可以说, 首先创建的项将被取走或从队列中弹出｡
‫为了查看队列中的项目, 我们可以使用峰值方法, 这个峰值方法将显示队列中的第一个项目,
‫可以说是队列的前面｡
‫这就像一个排队的人, 你在柜台前, 你想点东西,
‫比如说, 峰值法会给予你第一个要点东西的人.
‫让我们快速运行一下, 看看它是什么样子的｡
‫我们可以看到队列前面的值是1｡
‫现在, 让我们再添加几个值, 看看这将如何影响我们的应用程序｡
‫在这里我将添加不同的Q项, 如我将结束Q1, 然后在Q2和Q3中, 我将使用这些数字1, 2,
‫3｡
‫可能还有其他号码｡
‫不一定非得是一､ 二､ 三｡
‫因此, 通过峰化, 我们可以获得队列开头的项｡
‫你可以看到, 每次无论我们在Q中添加什么, 它都将是Q中的第一个项目,
‫因此它将是我们使用峰值方法时显示的项目｡
‫现在, 为了从队列中删除一个项目, 您将使用queue方法｡
‫所以在这里｡
‫所以这个Dq会去掉q的第一个整数, 它也会直接存储它,
‫所以我们可以把这个叫做Q项, 比如说, 它会存储这个dict项的结果｡
‫所以基本上它会存储一个因为这是列表中的第一项.
‫然后北京将展示两个, 因为现在一个已经不在那里了｡
‫第一件物品不见了｡
‫现在Q的值是2, 因为我们只解码第一项.
‫这类似于堆栈中的pop, 但它会移走Q开头的项, 而不是Q末尾或堆栈末尾的项,
‫不管你想怎么看.
‫当然, 您也可以尝试在开始时对项目进行排队｡
‫如果队列里面没有元素, 但是你会遇到一个无效操作异常｡
‫队列是空的, 因此您需要在运行此之前检查队列是否为空｡
‫所以这里我们可以运行queue方法因为我们知道我们只是编码了一些东西｡
‫但是, 否则您将使用队列的count属性来计算队列中有多少项｡
‫这就是你可以使用的属性, 获取队列中包含的元素数, 然后你可以检查这个数是否大于零,
‫例如, 检查队列中是否有你可以检查的东西, 例如,
‫队列｡
‫在这个特殊的例子中, 我将继续使用｡
‫在while循环中, 是否计算双重检查？
‫对于每一个项目, 我都要将其排队, 并记下仍在队列中的项目数量,
‫以及已删除的项目｡
‫所以这一行将通过调用queue方法删除该项, 同时它将在这里显示该项,
‫因为这就是我们在这里使用的.
‫我们用的是绳子, 对吧？
‫在这个位置为0的情况下, 它将显示队列调用的结果｡
‫正如你在这里看到的, queue方法将返回一个整数｡
‫我们在这里显示一个数字｡
‫好吧, 我会的
‫我先去掉这个提示, 我在这里用它来演示如何恢复一个项目｡
‫我们再来一遍｡
‫你可以看到前面的价值, 这一个｡
‫然后我们基本上从这里开始Y循环｡
‫这才是有趣的地方｡
‫因此, 从队列中移除一个单词｡
‫现在我们只剩下两个项目要从队列中删除｡
‫现在我们只剩下一个项目, 还有三个项目没有从队列中删除｡
‫现在我们只剩下零个项目了｡
‫因此, 基本上队列在该点是空的｡
‫好吧, 我会的
‫让我们看一个或多或少真实的的例子｡
‫当然, 在这个简单的例子中, 我们不使用数据库, 但假设我们有一个电子商务平台,
‫我们是卖家, 我们收到了一堆订单｡
‫这些订单应该被处理, 以便服务器的时间｡
‫所以顾客的等待时间应该保持在最短｡
‫这就是为什么我们要使用队列的原因, 因为它们非常实用,
‫因为我们关心的是订单进入的顺序｡
‫所以, 命令的顺序, 有点绕口令的意思, 但数据被接收的顺序,
‫我指的是命令本身.
‫让我们来看看这个非常简单的类, 我们将在这里构建它, 我将把它放在同一个文件中.
‫这个类的order有一个order ID属性, order quantity属性,
‫然后是构造函数, 当我们创建一个order对象时, 它基本上只设置这两个值,
‫然后我们有这个print message或者这个process order方法, 它将打印我们当前查看的商品的order ID,
‫也就是我们当前查看的订单.
‫现在我想做的是在我的程序类中创建方法｡
‫所以我将把它放在这个括号里, 还有处理不同分支指令的方法｡
‫假设我们有两个不同的分支机构, 我们可以从这两个分支机构获得订单｡
‫比如说, 我们在亚马逊和百思买同时销售｡
‫然后我们就可以拿到订单了｡
‫现在我们不想把它弄得太复杂, 我们要检查哪个分支是, 不同分支的顺序｡
‫当然, 如果你想发展的话, 你可以把这看作是对自己的一个小小挑战｡
‫但是我们只需要说, 好的, 给予第一分支的指令按正确的顺序给我,
‫把第二分支的指令也按正确的顺序给我｡
‫好吧, 我会的
‫这里是分支1, 它有一堆订单, 分支2有一堆订单.
‫所以我们正在获取数据｡
‫假设我们从一个数据库中获取这些数据, 我们在那里检查, 好吧, 订单是什么？
‫我们可能会按日期核对｡
‫所以每个订单也会有一个日期｡
‫这里我们有订单ID, 但通常我们也会尝试存储它是何时订购的等等｡
‫但是我们在这个例子中要保持简单｡
‫在这两个例子中我们都有一个订单数组｡
‫当我们调用这个方法, 从分支1和分支2接收命令时, 它们基本上只会返回并对数组排序｡
‫这里有一个订单数组｡
‫这就是这个语句的作用, 返回订单｡
‫现在, 在我们的特定示例中, 订单ID实际上对于两个不同的订单是唯一的｡
‫因此, 可以说, 它们已经处于正确的顺序｡
‫这是第一个, 这是第二个.
‫然后我们有来自分支2的订单3､ 订单4和订单5｡
‫然后在晚上, 在第一分支, 又来了一个订单, 有人购买了我们的十个项目｡
‫现在在main方法中, 我们可以创建一个队列, 让我把这里的所有东西都去掉.
‫在我们的main方法中, 现在可以继续创建一个订单队列｡
‫这里是队列顺序｡
‫你可以看到, 这不是一个简单的类型, 比如integer,
‫但它实际上包含了一堆指令.
‫这就是排队的好处｡
‫所以这不仅仅是简单的类型, 我将调用这个单序队列, 我将在这里直接初始化它｡
‫在这一点上, 我们可以继续, 通过使用这个for循环, 这个for each循环,
‫对从分支1得到的所有订单进行排队｡
‫所以我们要检查我要调用的每一个订单｡
‫哦, 在这个for each循环和这个迭代中, 在我们从分支1接收命令中｡
‫这是一个有序数组.
‫所以当我们调用这个方法的时候, 它会返回一个订单数组, 就像你在这里看到的｡
‫所以基本上, 这个for each循环会遍历这个order数组中的所有订单, 它会遍历每一个订单.
‫所以一切都将首先是这个顺序, 然后是这个顺序, 然后是那个顺序｡
‫对于每一个订单, 它都会结束这些订单的排队｡
‫这就是for each循环的作用｡
‫然后我们为每个分支创建另一个循环｡
‫是这样｡
‫对于每个循环或从分支2接收的订单也是如此｡
‫这是第二分支
‫这是第一分支
‫同样的道理也适用｡
‫所以同样的概念也适用｡
‫因此, 为了处理订单, 我们将逐个检查队列, 然后从队列中删除元素并处理它们,
‫直到队列为空, 所有订单都被最终处理｡
‫这就是为什么我们在这里有这个处理订单的方法, 它将处理订单｡
‫现在我们可以继续, 而不是这里的主方法,
‫一旦我们有了包含所有项目的订单队列, 我们就可以检查它, 检查订单队列是否不为空, 只要它不为空.
‫所以只要订单队列计数大于零, 我们就执行while循环,
‫并删除队列前端的订单.
‫所以可以说先进来的顺序, 并把它存储在一个叫做当前顺序的变量中｡
‫我们有一个叫做Current Order的订单对象,
‫它基本上是订单队列第一项中的队列结果｡
‫所以基本上先拿走这个, 然后这个, 然后那个, 然后这个, 然后那个, 然后那个｡
‫然后它会一步一步地处理每一个问题｡
‫所以处理我们的案子会很简单｡
‫它只会将其打印到控制台上｡
‫当然, 您可以在这里的后台运行一些更复杂的东西｡
‫这可能会触发一些事件,
‫例如, 向有时间处理电子邮件的员工或您在公司中使用的任何处理系统发送电子邮件｡
‫好吧, 我会的
‫是的, 基本上就是这样｡
‫现在, 让我们运行此应用程序来查看结果｡
‫我们可以看到订单1已处理｡
‫第二个订单处理完毕, 接着是第六个订单, 然后是第三个､ 第四个､ 第五个｡
‫所以我们正在处理订单｡
‫当然, 按照我们将它们排队的顺序, 我们将它们排队结束｡
‫您可以看到, 我们正在从1/1号分支排队, 然后从2号分支排队｡
‫想象一下下面的场景：订单是在系统内部创建的,
‫但首先必须接受这些订单, 并将其完全推送到处理实体, 无论该实体是什么, 例如另一个办公室等｡
‫例如, 他们在一天结束时这样做｡
‫所以第一个分支完成了他们的工作, 他们说, 好吧, 我们接受这些订单｡
‫然后那天晚些时候, 因为假设他们在不同的时区｡
‫例如, 分支2说, 是的, 我们同意｡
‫嗯, 我们发出我们的订单作为批准在这一点上, 以及, 然后他们开始被处理｡
‫这就是这个例子的意义, 对吗？
‫否则, 当然, 您会根据它们的ID或创建时间直接对它们进行排序｡
‫好吧, 我会的
‫因此, 现在您对这些订单和队列的工作方式有了一定的了解｡
‫这才是更重要的部分｡
‫因此, 现在您可以创建自己的队列, 并在应用程序中使用它们｡
‫好吧, 我会的
‫所以我希望你喜欢这个视频｡
‫下一场见｡