在不使用堆栈/队列的情况下列出目录和子目录中的文件的非递归方式[关闭]
Posted
技术标签:
【中文标题】在不使用堆栈/队列的情况下列出目录和子目录中的文件的非递归方式[关闭]【英文标题】:Non-recursive way to list files in directory and subdirectories without using stack/queue [closed] 【发布时间】:2012-04-25 18:19:55 【问题描述】:在一次采访中,我被要求列出目录及其子目录中的文件名¹,既不使用递归,也不使用堆栈或队列。
由于我知道的唯一非递归方式使用堆栈,我无法回答这个问题。
面试官解释了解决方案,但我无法理解。我唯一记得的是它涉及两种方法而不是一种。
什么是允许在没有递归、没有堆栈或队列的情况下列出目录及其子目录中的文件的方法?
¹ 解决方案与语言无关。子目录列表由ListDirectories(string directoryPath)
方法提供,文件由ListFiles(string directoryPath)
提供。我们事先并不知道子目录的深度。
【问题讨论】:
您是否允许使用对添加/删除的元素施加与 FIFO 或 LIFO 不同的顺序(或无顺序)的 ADT?例如,您是否可以使用一个堆来存储所有按名称排序的未探索文件夹?严格来说,这既不是栈也不是队列。 你可以建立一个你正在探索的文件夹的树。您可以在每个节点上使用一个标志来标记该节点是否已访问。 @vitalik:您可以将树视为队列/列表的更高级版本。 【参考方案1】:在深度优先搜索中,注意当前路径本质上是一个堆栈。以深度优先的方式列出名称,按照您的预期进行,但不要费心记录堆栈...当您在目录中列出文件后,您可以通过注意最后一个目录是什么来“弹出”堆栈您所在的位置,然后从父目录中的那一点继续。
【讨论】:
谢谢 - 我整个早上都在想这里是什么意思......必须补充一点,imo这是一个非常蹩脚的面试问题。这与理解任何重要的事情无关 - 只是玩“隐藏堆栈”......但也许我只是因为没有看到这个答案而感到痛苦。 在我看来这是一个半聪明的问题,但我同意这个措辞还有很多不足之处,因为它非常不精确。【参考方案2】:试试这样的东西(伪代码):
baseDirectory = "/usr"
list = [baseDirectory] // list of directories to traversal
files = []
while (list not empty)
d = list.getFirst(); // get directory
directories = ListDirectories(d);
files.add(ListFiles(d)); // add all files from current directory
list.add(directories); //add all directories from current directory to traversal
list.remove(d); // remove traversed dir
我们只使用列表 :) 但这种方法与堆栈/队列解决方案非常相似
【讨论】:
您正在使用队列。如果你称它为列表也没关系。您将列表用作队列。您正在从列表的开头将项目出列,并在列表的末尾将项目入队。 Imo,在采访中提出这样的建议会让你看起来很愚蠢。看起来好像您不知道队列功能是什么,并且您认为如果数据结构不称为队列,那么它就不是队列。在java中,其实LinkedList就是一个队列(实现了队列接口)。以上是关于在不使用堆栈/队列的情况下列出目录和子目录中的文件的非递归方式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不接触该目录中的文件的情况下查找文件夹更改(使用 Windows 和 C++)
如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?