【C++】每日一题 71 简化路径

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (...) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 '/' 开头。

两个目录名之间必须只有一个斜杠 '/' 。

最后一个目录名(如果存在)不能 以 '/' 结尾。

此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '...')。

返回简化后得到的 规范路径 。

cpp 复制代码
#include <iostream>
#include <sstream>
#include <vector>

std::string simplifyPath(std::string path) {
    std::vector<std::string> stack;
    std::stringstream ss(path);
    std::string dir;

    while (getline(ss, dir, '/')) {
        if (dir.empty() || dir == ".") {
            // Do nothing (current directory or empty)
        } else if (dir == "..") {
            if (!stack.empty()) {
                stack.pop_back();
            }
        } else {
            stack.push_back(dir);
        }
    }

    std::string result = "";
    for (const std::string& dir : stack) {
        result += "/" + dir;
    }

    return result.empty() ? "/" : result;
}

int main() {
    std::string path = "/home//foo/";
    std::string simplifiedPath = simplifyPath(path);

    std::cout << "Simplified Path: " << simplifiedPath << std::endl;

    return 0;
}

在这段 C++ 代码中,我们使用一个字符串流 std::stringstream 来逐个读取路径中的每个目录名,并根据规则进行处理。具体步骤如下:

  1. 将路径按照 '/' 分割,并遍历每个目录名 dir。
  2. 如果 dir 为空或为.,表示当前目录,不做任何操作。
  3. 如果 dir 为...,表示返回上一级目录,则弹出栈顶元素。
  4. 否则,将非空且不为.或...的目录名压入栈中。
  5. 最后,我们将栈中的目录名按照规范拼接起来,并返回简化后的规范路径。

补充:

std::stringstream 是 C++ 标准库中的一个类,用于在内存中创建一个可读写的字符序列。它主要用于将各种数据类型(如整数、浮点数、字符串等)转换为字符串,或者将字符串解析为各种数据类型。

std::stringstream 类通常用于以下两个方面:

数据类型转换: 可以使用 std::stringstream 将其他数据类型(如整数、浮点数)转换为字符串,或将字符串转换为其他数据类型。

字符串操作: 可以将多个字符串拼接成一个字符串,或者从一个字符串中提取需要的信息。

在 C++ 中,std::stringstream 提供了类似于输入输出流的操作符 << 和 >>,这使得它可以方便地用于将数据类型转换为字符串或从字符串中提取数据。

下面是一个简单的示例,演示如何使用 std::stringstream 将整数转换为字符串

cpp 复制代码
#include <iostream>
#include <sstream>

int main() {
    int num = 42;
    std::stringstream ss;
    ss << num; // 将整数转换为字符串

    std::string strNum = ss.str(); // 获取转换后的字符串
    std::cout << "Converted string: " << strNum << std::endl;

    return 0;
}

创建了一个 std::stringstream 对象 ss,并使用 << 操作符将整数 num 转换为字符串。然后,通过调用 ss.str() 方法,获取了转换后的字符串并输出。

在 C++ 的标准库中,std::stringstream 类包含一个名为 str() 的成员函数,用于获取 std::stringstream 对象中当前存储的字符串值。这个函数返回一个 std::string 对象,其中包含了 std::stringstream 中的内容。

当你向 std::stringstream 对象写入数据(使用 << 操作符)或从中读取数据时,这些数据会被存储在内部缓冲区中。通过调用 str() 函数,你可以获取整个缓冲区中的内容,并以字符串形式返回。这样你就可以方便地将 std::stringstream 中的数据提取出来,做进一步的处理或输出。

相关推荐
我能坚持多久3 分钟前
优选算法——专题一双指针(上):附四道例题详解
c++·学习·算法
Tim_108 分钟前
【C++】023、移动语义&深拷贝
开发语言·c++·算法
ctlover16 分钟前
Python模块与包
开发语言·python
雨田言炎18 分钟前
十、QThread多线程
linux·服务器·开发语言·前端·qt
ShineWinsu24 分钟前
对于C++中unordered_map的详细介绍
数据结构·c++·算法·面试·stl·哈希表·unordered_map
东东最爱敲键盘28 分钟前
day3.c++函数与预处理 string
c++·算法
在世修行1 小时前
从零打造 C# 工业视觉检测系统(十一):Task 异步编程与实时性保障
开发语言·c#·task异步
lingran__1 小时前
C++ 高阶数据结构:AVL 树万字详解|原理、四种旋转、key‑value 实现、调试校验、set/map/红黑树 底层前置知识
数据结构·c++·二叉搜索树·平衡二叉树·avl树·红黑树前置
爱和冰阔落1 小时前
【Linux】两个毫无关系的进程怎么通信?命名管道 FIFO 从原理到 Server/Client 实战
android·linux·数据库·c++·vim
码匠许师傅9 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?
c++·面试