[Powered by Google Translate] [队列] [克里斯·格柏,哈佛大学] 这是CS50,CS50.TV] 一个有用的数据结构,用于存储元素的有序集合,是一个队列。 它是用来当需要被删除的元素 以相同的顺序,它们被添加。 这个概念被称为FIFO,这是一个缩写为先,先出。 为了帮助可视化,它可能是有用的图片 一个在商店的收银台。 随着人们到达时,他们等待在后面的行。 收银员然后轮流在前面的为客户提供服务, 然后退出行一次一个。 在计算机科学中,我们指的队列前面的头部 和尾部背面作为。 一个例子时,我们可能会在应用程序中使用此 类入学候补名单。 由于座位成为可用的方法, 在头的等候名单的人提供了机会,以参加在课堂上。 队列可以使用任何集合 为了存储数据,如数组或链表。 随着集合来存储在队列中的项目, 我们还需要一种方法添加项目结束时的队列, 被称为入队 ,另一个是删除一个项目从队列头部, 被称为出列。 它是非常有用的另一种方法返回当前的队列长度 还有一个方法来检查,如果队列是空的。 让我们来看看我们怎么可能在C实现一个队列的整数, 使用一个数组元素的集合。 首先,我们创建了一个结构称为队列来保存我们的变量。 我们将使用一个固定大小的索引0的整数数组 存储的元素。 我们还将包括一个变量称为头 存储索引的元素,是目前在队列中的头。 第三个变量,长度,将用于 跟踪在数组中的元素的数量。 作为一种选择,你可以考虑使用一个变量称为尾 指向最后一个字段的数组中的元素。 在我们写更多的代码, 让我们尝试一下我们的设计。 让我们从一个空数组的长度为0, 与头部设置为0。 现在,让我们排队4个值 - 6,2,3和1​​。 现在的长度将是4, 头将保持为0。 如果我们取出一个值,会发生什么情况? 我们将降低至3的长度, 头部设置为1, 返回值6。 该代码可能会是这个样子。 在这里,我们出列的功能, 到队列 - q时 - 和一个指针的元素,需要一个指针 这是一个int类型的。 首先,我们检查,以确保它是大于0的队列长度, ,以确保有一个元素被出列。 然后,我们来看看数组中的元素,在该位置的头, 和设置的元素的值是在该位置上的值。 然后,我们改变了头,成为下一个索引 %的能力。 然后,我们减少队列长度由1。 最后,我们返回true,以指示出列是成功的。 如果我们再次出列,长度将成为2, 头也将成为2, 和返回值是2。 如果我们的入队的另一个值,如7,会发生什么事? 正如我们在队列的末尾, 我们将需要包装和存储0的数组元素中的值。 数学上,这可以通过添加长度表示 头部的索引 以及执行使用队列容量模量。 这里说的是2 2,这是4%4, 它是0。 将这种想法的代码,我们有这个功能。 在这里,我们看到了排队功能, 这需要一个指针到队列 - q时 - 并采取被排队的元素,它是一个整数。 接下来,我们检查,以确保容量的队列 依然大于当前队列长度。 接下来,我们存储元素的数组中的元素 索引处由头+长度%的队列的能力来确定。 然后,我们增加队列长度为1, 然后返回true以指示排队功能是成功的。 除了我们已经提到的两个函数, 有两个额外的功能。 首先是IsEmpty函数, 这需要一个指针到队列 并验证长度为0。 第二个是长度函​​数, 这也需要一个指针到队列 从结构并返回当前的长度。 这个简短的概述,展示了一种可能的实现的队列。 本实施方案的局限性之一 是队列有一个固定的最大大小。 如果我们尝试加入更多的元素比队列可以容纳的, 我们可能需要忽略的要求和删除元素, 或者,我们可能更愿意返回某种类型的错误。 使用一个链表,而不是一个数组 将使其更容易进行动态的队列的大小。 然而,由于我们不直接访问一个链表的元素, 如果我们不跟踪的尾巴, 我们将不得不扫描整个链表,每次去年底。 我们也可以考虑使用另一种数据类型的数组, 如结构,以创建更复杂的元素的队列中。 回想我们的例子中的一类候补名单, 这些结构可能代表个别学生。 我的名字是克里斯·格柏,这是CS50。 [CS50.TV] 和回报 - >>更多的时间。 返回true,表示 - 的队列是成功的。 - %的容​​量的队列 - 这将是在编辑的乐趣。 [笑]