在不使用堆栈/队列的情况下列出目录和子目录中的文件的非递归方式[关闭]

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 中的所有模式和表空间?

如何在不使用 python 保留目录的情况下提取文件夹中的所有 .zip 扩展名?

如何在不应用盐堆栈的情况下渲染和转储文件 sls

如何在不添加目录层次结构的情况下使用 Python 将文件添加到 tarfile?