为了尝试简化堆栈和队列的描述,它们都是信息元素的动态链,可以从链的一端进行访问,它们之间的唯一真正区别是:
使用堆栈时
- 您在链的一端插入元素,然后
- 您从链的同一端检索和/或删除元素
排队时
- 您在链的一端插入元素,然后
- 您从另一端检索/删除它们
注意:在这种情况下,我使用的是“检索/删除”的抽象措词,因为在某些情况下,您只是从链中检索元素,或者在某种意义上只是读取或访问其值,但是在某些情况下,您从链中删除了元素最后,在某些情况下,您使用同一调用执行两个操作。
同样,有意使用单词元素是为了尽可能抽象出虚构的链,并将其与特定的编程语言术语分离。取决于语言,这个称为元素的抽象信息实体可以是任何东西,例如指针,值,字符串或字符,对象等等。
在大多数情况下,尽管它实际上是一个值或一个存储位置(即指针)。其余的只是将这个事实隐藏在语言行话中<
当元素的顺序很重要并且需要与元素首次进入程序时完全相同时,队列可能会有所帮助。例如,当您处理音频流或缓冲网络数据时。或者,当您执行任何类型的存储和转发处理时。在所有这些情况下,您都需要按照与进入程序时相同的顺序输出元素的顺序,否则信息可能就失去意义了。因此,您可以将程序分解为一部分,该部分从某些输入读取数据,进行一些处理,然后将其写入队列中,而从队列中检索数据的一部分将对其进行处理,然后将其存储在另一个队列中,以进行进一步处理或传输数据。 。
当您需要临时存储将在程序的立即步骤中使用的元素时,堆栈可能会有所帮助。例如,编程语言通常使用堆栈结构将变量传递给函数。他们实际上所做的是将函数参数存储(或推入)堆栈中,然后跳转到函数中,从堆栈中删除并检索(或弹出)相同数量的元素。这样,堆栈的大小取决于函数的嵌套调用数。另外,在调用一个函数并完成其工作之后,它会将堆栈保持与调用之前完全相同的状态!这样,任何功能都可以在堆栈中运行,而忽略其他功能如何运行。
最后,您应该知道,还有其他术语用于类似概念的相同术语。例如,堆栈可以称为堆。这些概念也有混合版本,例如双端队列可以同时作为堆栈和队列运行,因为两端可以同时访问它。此外,数据结构以堆栈或队列的形式提供给您的事实并不一定意味着它是照此实现的,在某些情况下,数据结构可以实现为任何形式并可以作为特定形式提供数据结构仅仅是因为它可以使其表现得像这样。换句话说,如果您为任何数据结构提供推入和弹出方法,它们就会神奇地变成堆栈!