堆栈、队列和链表
Stacks, queues and linked lists
我最近开始学习数据结构,并且刚刚有了自己的linked list
实现。
现在我偶然发现了两个新的数据结构:stack
和 queue
。
据我目前所学
stack
是一个 linked list
只允许从它的尾部插入/删除,并且
queue
是一个 linked list
,它只允许在它的尾部插入并且只允许从它的头部移除。
我的问题是:
为什么我要使用这两个数据结构而不是允许从任何地方插入和删除的常规 linked list
?
另外,为什么这两个数据结构被归类为独立的数据结构而不是 "limited access linked lists"?
Stack is basically a data structure that follows LIFO (LAST IN FIRST
OUT). Queue is one which follows FIFO (FIRST IN FIRST OUT).
一般来说,Stacks
和Queues
可以用Arrays
和Linked Lists
实现。
您使用 Linked List
来实现 Stack
的原因是当您需要涉及后进先出形式的功能并且您不确定该功能需要多少元素时。因此,您将使用 LinkedList
根据要求动态创建节点。
Queues
也是如此
两者之所以独立,是因为它们分别遵循不同的原则,即后进先出和先进先出。
栈和队列各有其存在的理由。
堆栈是一种 FILO(先进后出)或 LIFO(无论哪种方式)数据结构,可以使用数组、链表或其他形式来实现。考虑浏览器历史记录。您导航到 站点 A -> 然后 B -> 然后 C -> D。当用户向前移动时,您首先 push(在尾部插入)网站列表。这确保当前站点始终位于堆栈的顶部。
然后当用户点击后退按钮时,您 pop 顶部的那个(从尾部移除 - 用于插入的同一端)给出上次访问的站点 - C。因此,先入(即 站点 A)和后出(最后进入的是 站点 D 的概念又成为第一个出去的)
FIFO(先进先出)队列也可以这样说。考虑作业队列的例子。在执行一项工作时,您会(不考虑任何优化算法)服务于第一个到达的人。这使得队列成为一种优秀的数据结构,可以按照先到先得的原则处理作业。
在这两种情况下,您都不想在任何索引处任意删除或插入元素。不,那会导致不良行为。因此,需要stack/queue。我再次强调,stacks/queues可以通过对链表进行限制来实现。
抱歉图像质量不佳 - 我只是用油漆画的。
链表是一种数据结构,内存中的元素之间存在一定的关系,
而栈和队列是有一定接口的数据结构,behavior.Stack和队列甚至可以在数组中实现,所以它们是遵循一定规则的数据结构,即堆栈的LIFO和队列的FIFO,(它们不是仅限于链表,它们也可以在其他数据结构(如数组)中实现,重要的是它们遵循的行为和规则)
我最近开始学习数据结构,并且刚刚有了自己的linked list
实现。
现在我偶然发现了两个新的数据结构:stack
和 queue
。
据我目前所学
stack
是一个 linked list
只允许从它的尾部插入/删除,并且
queue
是一个 linked list
,它只允许在它的尾部插入并且只允许从它的头部移除。
我的问题是:
为什么我要使用这两个数据结构而不是允许从任何地方插入和删除的常规 linked list
?
另外,为什么这两个数据结构被归类为独立的数据结构而不是 "limited access linked lists"?
Stack is basically a data structure that follows LIFO (LAST IN FIRST OUT). Queue is one which follows FIFO (FIRST IN FIRST OUT).
一般来说,Stacks
和Queues
可以用Arrays
和Linked Lists
实现。
您使用 Linked List
来实现 Stack
的原因是当您需要涉及后进先出形式的功能并且您不确定该功能需要多少元素时。因此,您将使用 LinkedList
根据要求动态创建节点。
Queues
两者之所以独立,是因为它们分别遵循不同的原则,即后进先出和先进先出。
栈和队列各有其存在的理由。
堆栈是一种 FILO(先进后出)或 LIFO(无论哪种方式)数据结构,可以使用数组、链表或其他形式来实现。考虑浏览器历史记录。您导航到 站点 A -> 然后 B -> 然后 C -> D。当用户向前移动时,您首先 push(在尾部插入)网站列表。这确保当前站点始终位于堆栈的顶部。
然后当用户点击后退按钮时,您 pop 顶部的那个(从尾部移除 - 用于插入的同一端)给出上次访问的站点 - C。因此,先入(即 站点 A)和后出(最后进入的是 站点 D 的概念又成为第一个出去的)
FIFO(先进先出)队列也可以这样说。考虑作业队列的例子。在执行一项工作时,您会(不考虑任何优化算法)服务于第一个到达的人。这使得队列成为一种优秀的数据结构,可以按照先到先得的原则处理作业。
在这两种情况下,您都不想在任何索引处任意删除或插入元素。不,那会导致不良行为。因此,需要stack/queue。我再次强调,stacks/queues可以通过对链表进行限制来实现。
抱歉图像质量不佳 - 我只是用油漆画的。
链表是一种数据结构,内存中的元素之间存在一定的关系, 而栈和队列是有一定接口的数据结构,behavior.Stack和队列甚至可以在数组中实现,所以它们是遵循一定规则的数据结构,即堆栈的LIFO和队列的FIFO,(它们不是仅限于链表,它们也可以在其他数据结构(如数组)中实现,重要的是它们遵循的行为和规则)