注意堆栈和队列

最基本的两个抽象数据结构是堆栈和队列。 它们有助于回答“下一步是什么?”问题,因为它们可以通过多种方式实现,例如使用数组或链接列表,因此被认为是抽象的。 就像大多数简单无所不在的事物一样,很容易忘记它们的重要性。

排队的物质世界例子很多。 我们希望排队的第一人在后来到达的人之前得到服务。 我们记得将新的满满的鸡蛋盒放在半个空鸡蛋的后面,以确保先将接近到期的鸡蛋食用。

堆栈的物理示例通常是为简化或节省空间而实现的,而不是因为最后一个堆栈的优先级要高于后面的堆栈。 自助餐线前部的弹簧板堆叠顶部没有最干净或最好的板块,只是那样才更合适。

编程中,使用堆栈或队列之间的区别非常明显,因为它们可以解决非常不同的问题。 就像遍历树时一样,将深度优先搜索更改为广度优先是通过用队列替换持有要搜索的子节点的堆栈来完成的。

在上面的DFS中,所有A的子代都放置在堆栈中以进行搜索。 B是第二个要搜索的对象,并且B的所有子代都添加到堆栈中,从而将C的优先级进一步推低。 在BFS中进行相同的搜索,但是每个孩子都被排在队列中,从而导致顺序非常不同,并有助于回答不同的问题。

如果您感到忙碌但没有完成,或者在一天结束时发现自己有很多打开的浏览器选项卡,则可能需要考虑何时使用队列,何时使用堆栈以及如何实现两者。

在时间管理中,堆栈与队列问题与重要与紧急问题具有相似之处。 据说打来的电话很紧急。 呼叫者,消息以及造成中断的因素都可能影响该消息是否重要。 如果必须在一天中的任何时间应答任何正在振铃的电话,则可以说已将其推入您的注意堆栈的顶部。

计算机的处理器使用队列和堆栈。 新传入的任务被放入行中以按顺序进行处理。 但是,当下一行准备好处理时,它将放置在堆栈的顶部。 如果在执行该动作时,动作本身调用了另一个子动作,该动作必须在原始动作才能继续之前完成,则新动作将被置于原始动作之前的堆栈顶部。 堆栈的顶部始终是正在处理的内容,一旦堆栈为空,则可以将队列中的下一项添加到堆栈中。

学习编程时,经常会遇到指向其他内容的链接,或者需要使用Google尚不了解的内容。 确定某个内容是否需要完整,立即的阅读和理解(添加到堆栈中)还是在以后的某个时间深入研究(添加到队列中)有用的东西需要实践和纪律。 拥有良好的导师或老师也可以帮助您保持进度。