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