【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 中的数据提取出来,做进一步的处理或输出。

相关推荐
moxiaoran5753几秒前
Go语言的接口
开发语言·后端·golang
浮尘笔记13 分钟前
Go语言中的同步等待组和单例模式:sync.WaitGroup和sync.Once
开发语言·后端·单例模式·golang
王老师青少年编程13 分钟前
信奥赛C++提高组csp-s之二分图
数据结构·c++·二分图·csp·信奥赛·csp-s·提高组
柏木乃一15 分钟前
进程(11)进程替换函数详解
linux·服务器·c++·操作系统·exec
Q741_14715 分钟前
C++ 队列 宽度优先搜索 BFS 力扣 429. N 叉树的层序遍历 C++ 每日一题
c++·算法·leetcode·bfs·宽度优先
lsx20240615 分钟前
C++ 变量作用域
开发语言
CSDN_RTKLIB17 分钟前
CMake成果打包
c++
小鸡脚来咯20 分钟前
设计模式面试介绍指南
java·开发语言·单例模式
小北方城市网20 分钟前
GEO 全场景智能生态:自适应架构重构与极限算力协同落地
开发语言·人工智能·python·重构·架构·量子计算
Yu_Lijing26 分钟前
基于C++的《Head First设计模式》笔记——工厂模式
c++·笔记·设计模式