双链表,队列和堆栈是否有实际用途?

时间:2009-09-16 05:51:28

标签: data-structures

我已经编写了很长一段时间了。我的工作涉及解决现实世界的业务场景。但是,我并没有真正遇到过某些数据结构的实际用法,比如链接列表,队列和堆栈等。

甚至没有在业务框架级别。当然,无处不在的HashTable,ArrayList和最近的List ......但是有没有其他一些基本数据结构的实际用法?

如果有人提供了一个真实世界的解决方案,其中双重链接列表“表现”比明显易于使用的对手更好,那将会很棒。

7 个答案:

答案 0 :(得分:3)

当然,只有Map(又名HashTable)和List才能过关。 Queue只是一个荣耀的List,但如果你在任何地方都使用Queue,那么你真的需要一个队列,那么你的代码会更具可读性,因为没有人必须猜测你使用的是什么{ {1}} for。

然后,当底层数据结构不是普通List而是List时,由于他们必须导航列表的方式,有些算法可以更好地工作。这同样适用于所有其他数据结构:它们总是有用。 :)

答案 1 :(得分:2)

堆栈可用于配对(解析),例如将开括号与右括号匹配。

队列可用于消息传递或活动处理。

链接列表或双链表可用于循环导航。

答案 2 :(得分:1)

这些算法中的大多数通常都比通常的“业务”应用程序低。例如,数据库上的索引是多重链表的变体。函数调用机制(或解析树)的实现是一个堆栈。队列和FIFO用于服务网络请求等。

这些只是在各种情况下针对速度进行优化的集合结构的示例。

答案 3 :(得分:1)

LIFO-Stack和FIFO-Queue是相当抽象的(行为规范级)数据结构,所以当然对它们有很多实际用途。例如,LIFO-Stack是一种帮助删除递归的好方法(堆叠当前状态和循环,而不是进行递归调用); FIFO-Queue有助于在协同安排中“缓冲”和“剥离”工作块;等等。

双重链接列表更多是一个实现问题,而不是行为规范级别,例如,大多数......可能是实现FIFO队列的好方法。如果你需要一个快速拼接和删除的序列给出一个指向一个序列的指针,你也会发现很多其他的实际用途。

答案 4 :(得分:1)

我一直在商业解决方案中使用队列,链接列表等。

除了它们由Oracle,IBM,JMS等实现。

这些构造通常处于比实现业务解决方案时要低得多的抽象级别。业务问题可以从中受益 如此低水平的结构(例如交付路线规划,生产线调度等)通常有一个包可用来做它或你。

答案 5 :(得分:1)

我不经常使用它们,但它们确实出现了。例如,我在当前项目中使用队列来处理必须按用户创建的顺序发生的异步字符设备更改。

答案 6 :(得分:1)

如果您有更多项目中的“已选择”项目的子集,则链接列表非常有用,您必须对“已选择”项目执行一种操作,并且必须执行默认操作或根本不执行任何操作正常项目和“选定”项目集可以随意改变(可能由于用户输入)。因为链接列表删除几乎可以即时完成(相对于数组搜索所需的遍历时间),如果子集足够大,则维护链表比维护数组或重新生成整个子集更快每次需要子集时扫描整个较大的集合。

使用哈希表或二叉树,您可以搜索单个“选定”项目,但无法检查所有“选定”项目而不检查每个项目(或者为所选项目的每个排列都有单独的字典,这显然是不切实际的。)

如果您处于有大量请求进入并且您希望确保按顺序公平处理它们的情况下,队列可能很有用。

每当我有一个递归算法时,我就会使用堆栈,这通常意味着它在一些分层数据结构上运行,如果我的内存不足,我想打印一条错误消息而不是简单地让程序堆栈运行时软件崩溃空间不足。我不是递归地调用函数,而是将其局部变量存储在对象中,运行循环并维护这些对象的堆栈。