1-10 目錄樹

在ZIP歸檔文件中,保留著所有壓縮文件和目錄的相對路徑和名稱。當使用WinZIP等GUI軟件打開ZIP歸檔文件時,可以從這些信息中重建目錄的樹狀結構。請編寫程序實現目錄的樹狀結構的重建工作。

輸入格式:

輸入首先給出正整數N(≤104),表示ZIP歸檔文件中的文件和目錄的數量。隨后N行,每行有如下格式的文件或目錄的相對路徑和名稱(每行不超過260個字符):

  • 路徑和名稱中的字符僅包括英文字母(區分大小寫);
  • 符號“\”僅作為路徑分隔符出現;
  • 目錄以符號“\”結束;
  • 不存在重復的輸入項目;
  • 整個輸入大小不超過2MB。

輸出格式:

假設所有的路徑都相對于root目錄。從root目錄開始,在輸出時每個目錄首先輸出自己的名字,然后以字典序輸出所有子目錄,然后以字典序輸出所有文件。注意,在輸出時,應根據目錄的相對關系使用空格進行縮進,每級目錄或文件比上一級多縮進2個空格。

輸入樣例:

7
b
c\
ab\cd
a\bc
ab\d
a\d\a
a\d\z\

輸出樣例:

rootadzabcabcddcb

一、問題核心與難點

本任務要求根據給定的文件路徑列表,構建完整的目錄樹結構,并按照特定格式輸出。主要挑戰在于:

  1. ??路徑層級解析??:需要正確處理路徑分隔符"",識別目錄與文件
  2. ??樹形結構構建??:動態創建多級目錄節點
  3. ??字典序輸出??:保證同級目錄和文件的順序正確

二、數據結構設計

采用樹形結構進行存儲,每個節點包含:

struct Node {string name;map<string, Node*> dirs;  // 有序存儲子目錄map<string, Node*> files; // 有序存儲文件
};

使用map容器實現自動字典序排序,其中:

  • dirs存儲下級目錄節點
  • files存儲當前目錄下的文件

三、實現流程詳解

1. 路徑分割處理

通過split函數解析路徑字符串:

vector<string> split(const string &s) {vector<string> tokens;// 處理邏輯:遇到"\"分割路徑組件// 保留空組件用于目錄判斷
}

該函數將類似"a\d\z"的路徑轉換為["a", "d", "z"],同時通過原字符串末尾的""判斷是否為目錄。

2. 樹形結構構建
Node* current = root;
for (auto &comp : tokens) {if (需要創建目錄) {current->dirs[comp] = new Node(comp);}current = 下一級節點;
}

逐級創建目錄節點,文件存儲在終末節點的files集合中。

3. 遞歸輸出邏輯
void printTree(Node* node, int indent) {// 輸出當前節點// 遞歸輸出子目錄// 輸出文件
}

采用深度優先遍歷,通過縮進參數控制格式,實現:

  • 目錄優先于文件輸出
  • 同級元素按字母序排列

四、關鍵實現技巧

  1. ??目錄/文件區分??:通過原始路徑的結尾字符判斷類型
  2. ??自動排序機制??:利用map的有序特性簡化排序邏輯
  3. ??內存管理??:使用裸指針需注意內存釋放(實際應用中建議使用智能指針)

五、示例分析

輸入樣例:

a\d\z\

處理流程:

  1. 識別為目錄
  2. 分割為["a", "d", "z"]
  3. 在root下創建a節點
  4. 在a節點下創建d節點
  5. 在d節點下創建z目錄節點

完整代碼:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <string>using namespace std;struct Node {string name;map<string, Node*> dirs;map<string, Node*> files;Node(string n) : name(n) {}
};vector<string> split(const string &s) {vector<string> tokens;string token;for (char c : s) {if (c == '\\') {if (!token.empty()) {tokens.push_back(token);token.clear();}} else {token += c;}}if (!token.empty()) {tokens.push_back(token);}return tokens;
}void printTree(Node* node, int indent) {if (indent == 0) {cout << node->name << endl;} else {cout << string(indent * 2, ' ') << node->name << endl;}for (auto &dir : node->dirs) {printTree(dir.second, indent + 1);}// 輸出子文件for (auto &file : node->files) {cout << string((indent + 1) * 2, ' ') << file.second->name << endl;}
}int main() {int n;cin >> n;cin.ignore(); // 忽略換行符Node* root = new Node("root");for (int i = 0; i < n; ++i) {string s;getline(cin, s);bool isDir = !s.empty() && s.back() == '\\';vector<string> tokens = split(s);Node* current = root;for (size_t j = 0; j < tokens.size(); ++j) {string comp = tokens[j];bool isLast = (j == tokens.size() - 1);if (isLast) {if (isDir) {if (current->dirs.find(comp) == current->dirs.end()) {current->dirs[comp] = new Node(comp);}current = current->dirs[comp];} else {current->files[comp] = new Node(comp);}} else {if (current->dirs.find(comp) == current->dirs.end()) {current->dirs[comp] = new Node(comp);}current = current->dirs[comp];}}}printTree(root, 0);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80109.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲實戰:研究 RPC 遠程調用機制,實現逆向解密

1. 引言 在網絡爬蟲技術的實際應用中,目標網站通常采用各種加密手段保護其數據傳輸和業務邏輯。這些加密機制給爬蟲開發帶來了巨大挑戰,傳統的爬蟲技術往往難以應對復雜的加密算法。逆向解密作為一種應對策略,旨在通過分析和破解目標網站的加密機制,獲取原始數據。 然而,…

debugfs:Linux 內核調試的利器

目錄 一、什么是 debugfs&#xff1f;二、debugfs 的配置和啟用方式2.1 內核配置選項2.2 掛載 debugfs2.3 Android 系統中的 debugfs 三、debugfs 的典型應用場景3.1 調試驅動開發3.2 內核子系統調試3.3 性能分析 四、常見 debugfs 子目錄與功能示例4.1 /sys/kernel/debug/trac…

lua 作為嵌入式設備的配置語言

從lua的腳本中獲取數據 lua中棧的索引 3 | -1 2 | -2 1 | -3 可以在lua的解釋器中加入自己自定的一些功能,其實沒啥必要,就是為了可以練習下lua

棋牌室臺球室快速接入美團團購接口

北極星平臺從2024年12月份開始慢慢關閉&#xff0c;現在很多開發者反饋北極星token已經不能刷新了&#xff0c;全部遷移到美團團購綜合平臺。 申請這個平臺要求很高 1、保證金費用要15萬起步 2、平臺必須是二級等保和安全產品 &#xff0c;一個二級等保費用10萬起步 所以很多…

開源輕量級地圖解決方案leaflet

Leaflet 地圖&#xff1a;開源輕量級地圖解決方案 Leaflet 是一個開源的 JavaScript 庫&#xff0c;用于在網頁中嵌入交互式地圖。它以輕量級、靈活性和易用性著稱&#xff0c;適用于需要快速集成地圖功能的項目。以下是關于 Leaflet 的詳細介紹和使用指南。 1. Leaflet 的核心…

一個批量文件Dos2Unix程序(Microsoft Store,開源)1.1.0 編碼檢測和預覽

之前的版本是個意思意思&#xff0c;驗證商店發布的&#xff08;其實是我以前自己用的工具&#xff09;&#xff0c;這次把格式檢查和轉換都做上了&#xff0c;功能應該差不多了&#xff0c;還有一些需要小改進的地方。 因為還沒什么用戶嘛&#xff0c;還是保持全功能免費試用。…

特征提取:如何從不同模態中獲取有效信息?

在多模態學習中&#xff0c;不同模態&#xff08;文本、圖像、語音、視頻、傳感器數據等&#xff09;所攜帶的信息豐富且互補。但不同模態的數據結構、表示空間、時空分布截然不同&#xff0c;因此&#xff0c;如何對各模態進行高效、有效的特征提取&#xff0c;是整個多模態學…

Go語言爬蟲系列教程 實戰項目JS逆向實現CSDN文章導出教程

爬蟲實戰&#xff1a;JS逆向實現CSDN文章導出教程 在這篇教程中&#xff0c;我將帶領大家實現一個實用的爬蟲項目&#xff1a;導出你在CSDN上發布的所有文章。通過分析CSDN的API請求簽名機制&#xff0c;我們將繞過平臺限制&#xff0c;獲取自己的所有文章內容&#xff0c;并以…

交叉熵損失函數,KL散度, Focal loss

交叉熵損失函數&#xff08;Cross-Entropy Loss&#xff09; 交叉熵損失函數&#xff0c;涉及兩個概念&#xff0c;一個是損失函數&#xff0c;一個是交叉熵。 首先&#xff0c;對于損失函數。在機器學習中&#xff0c;損失函數就是用來衡量我們模型的預測結果與真實結果之間…

149.WEB滲透測試-MySQL基礎(四)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;148.WEB滲透測試-MySQL基礎&#xff08;三&#xff09; 非關系型數據庫&#xff1a; &a…

c/c++中程序內存區域的劃分

c/c程序內存分配的幾個區域&#xff1a; 1.棧區&#xff1a;在執行函數時&#xff0c;函數內局部變量的存儲單元都可以在棧上創建&#xff0c;函數執行結束時這些存儲單元自動被釋放&#xff0c;棧內存分配運算內置于處理器的指令集中&#xff0c;效率很高但是分配的內存容量有…

構建穩定的金字塔模式生態:從自然法則到系統工程

在自然界中&#xff0c;金字塔結構廣泛存在于生態系統之中&#xff0c;表現為營養級能量金字塔、生物量金字塔和數量金字塔等形式。這種結構不僅形象地描述了生態能量流轉的規律&#xff0c;也體現出生態系統中“穩定性”與“層級性”的天然法則。在現代軟件架構、企業組織、平…

Vue 3.0雙向數據綁定實現原理

Vue3 的數據雙向綁定是通過響應式系統來實現的。相比于 Vue2&#xff0c;Vue3 在響應式系統上做了很多改進&#xff0c;主要使用了 Proxy 對象來替代原來的 Object.defineProperty。本文將介紹 Vue3 數據雙向綁定的主要特點和實現方式。 1. 響應式系統 1.1. Proxy對象 Vue3 …

TIP-2021《SRGAT: Single Image Super-Resolution With Graph Attention Network》

推薦深藍學院的《深度神經網絡加速&#xff1a;cuDNN 與 TensorRT》&#xff0c;課程面向就業&#xff0c;細致講解CUDA運算的理論支撐與實踐&#xff0c;學完可以系統化掌握CUDA基礎編程知識以及TensorRT實戰&#xff0c;并且能夠利用GPU開發高性能、高并發的軟件系統&#xf…

大語言模型與多模態模型比較

一、核心差異&#xff1a;輸入數據類型與模態融合 輸入數據類型 LLM&#xff1a;僅處理文本數據&#xff0c;例如文本分類、機器翻譯、問答等任務&#xff0c;通過大規模語料庫學習語言規律。 LMM&#xff1a;支持文本、圖像、音頻、視頻等多種模態輸入&#xff0c;例如根據圖…

Apache HttpClient 5 用法-Java調用http服務

Apache HttpClient 5 核心用法詳解 Apache HttpClient 5 是 Apache 基金會推出的新一代 HTTP 客戶端庫&#xff0c;相比 4.x 版本在性能、模塊化和易用性上有顯著提升。以下是其核心用法及最佳實踐&#xff1a; 一、添加依賴 Maven 項目&#xff1a; <dependency><…

基于 Spark 的流量統計

一、引言 在互聯網行業&#xff0c;流量統計是分析網站或應用用戶行為、評估業務表現、優化資源分配以及制定營銷策略的關鍵環節。借助 Apache Spark 強大的分布式數據處理能力&#xff0c;我們可以高效地對大規模的流量數據進行統計分析&#xff0c;獲取有價值的洞察。本文將…

Python模塊化編程進階指南:從基礎到工程化實踐

一、模塊化編程核心原理與最佳實踐 1.1 模塊化設計原則 根據企業級項目實踐&#xff0c;模塊化開發應遵循以下核心原則&#xff1a; ??單一職責原則??&#xff1a;每個模塊只承擔一個功能域的任務&#xff08;如用戶認證模塊獨立于日志模塊&#xff09;??接口隔離原則…

銳捷交換機STP環路日志信息解讀

因公司網絡組建使用銳捷全系列交換機&#xff0c;近期設備巡檢時發現部分日志提示信息&#xff0c; 接入交換機NBS3100-24GT4SFP-V2&#xff0c;設備頻繁打出STP Blocking的日志信息。 誤以為是環路導致&#xff0c;故進行實驗測試&#xff0c;來驗證環路情況下會如何報日志。…

使用Python調用DeepSeek的示例

使用Python調用DeepSeek API的示例代碼,包括API密鑰的獲取、基本請求的發送以及響應處理。請確保你已經注冊了DeepSeek賬號并獲取了API密鑰。 文章目錄 前言一、獲取API密鑰二、python示例代碼三、代碼說明四、注意事項五、擴展功能總結前言 提示:這里可以添加本文要記錄的大…