实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。 支持命令: 创建目录命令:mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。 进入目录命令:cd 目录名称,如 cd abc 为进入abc目录,特别地,cd … 为返回上级目录,如果目录不存在则不执行任何操作。此命令无输出。 查看当前所在路径命令:pwd,输出当前路径字符串。 约束: 目录名称仅支持小写字母;mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc;不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。 目录符号为/,根目录/作为初始目录。 任何不符合上述定义的无效命令不做任何处理并且无输出。 输入描述 输入 N 行字符串,每一行字符串是一条命令。 命令行数限制100行以内,目录名称限制10个字符以内。 输出描述 输出最后一条命令运行结果字符串。C++
时间: 2025-06-26 09:01:16 浏览: 11
### 如何实现一个简单的文件系统模拟器
为了构建一个支持 `mkdir`、`cd` 和 `pwd` 命令的简单文件系统模拟器,可以通过设计类来表示当前的工作目录结构和路径状态。以下是详细的解决方案:
#### 数据结构的设计
使用嵌套的数据结构来存储目录树的信息。最常见的方式是通过哈希表(`std::unordered_map` 或 `std::map`)或者向量(`std::vector`)。这里推荐使用 `std::unordered_map<std::string, Directory*>` 来映射子目录名称与其指针。
定义一个 `Directory` 类用来保存每个目录的状态及其子目录列表:
```cpp
#include <iostream>
#include <unordered_map>
#include <string>
class Directory {
public:
std::string name;
Directory* parent; // 指向上级目录
std::unordered_map<std::string, Directory*> subdirectories;
Directory(std::string dirName, Directory* parentNode = nullptr) : name(dirName), parent(parentNode) {}
~Directory() {
for (auto& pair : subdirectories) {
delete pair.second;
}
}
void createSubdirectory(const std::string& subdirName) {
if (!subdirectories.contains(subdirName)) { // 防止重复创建
subdirectories[subdirname] = new Directory(subdirname, this);
} else {
std::cout << "Error: Subdirectory already exists." << std::endl;
}
}
Directory* changeDirectory(const std::string& path) {
if (path == "..") {
return parent; // 返回上级目录
} else if (path == ".") {
return this; // 当前目录不变
} else if (subdirectories.find(path) != subdirectories.end()) {
return subdirectories[path]; // 进入子目录
} else {
std::cerr << "Error: No such directory '" << path << "'\n";
return this; // 如果找不到,则保持原状
}
}
std::string getFullPath() const {
if (parent == nullptr) {
return "/";
} else {
std::string fullPath = parent->getFullPath();
if (fullPath.back() != '/') fullPath += '/';
fullPath += name;
return fullPath;
}
}
};
```
#### 解析命令序列
编写一个函数来解析输入的命令序列,并依次执行每条命令直到完成整个过程。最后返回最后一项有效命令的结果。
```cpp
void processCommands(Directory* rootDir, const std::vector<std::string>& commands) {
Directory* currentDir = rootDir;
for (const auto& commandLine : commands) {
size_t spacePos = commandLine.find(' ');
std::string cmd = commandLine.substr(0, spacePos);
if (cmd == "mkdir") {
if (spacePos != std::string::npos && spacePos + 1 < commandLine.size()) {
std::string dirname = commandLine.substr(spacePos + 1);
currentDir->createSubdirectory(dirname); // 创建新目录
} else {
std::cerr << "Usage error: mkdir requires a directory name.\n";
}
} else if (cmd == "cd") {
if (spacePos != std::string::npos && spacePos + 1 < commandLine.size()) {
std::string targetPath = commandLine.substr(spacePos + 1);
currentDir = currentDir->changeDirectory(targetPath); // 切换工作目录
} else {
std::cerr << "Usage error: cd requires a valid path.\n";
}
} else if (cmd == "pwd") {
std::cout << currentDir->getFullPath() << "\n"; // 打印当前绝对路径
} else {
std::cerr << "Unknown command: " << cmd << "\n";
}
}
}
```
#### 测试代码示例
下面是一个完整的测试案例展示如何初始化根目录并处理一系列命令。
```cpp
int main() {
Directory* root = new Directory("/");
std::vector<std::string> inputCommands = {"mkdir home", "cd home", "mkdir user", "cd ..", "pwd"};
processCommands(root, inputCommands);
delete root; // 清理内存资源
return 0;
}
```
此程序将按照顺序解释上述命令集中的每一行,并打印最后一个有效的 `pwd` 结果作为最终输出。
---
###
阅读全文
相关推荐



















