首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Codeforces 158C Cd and pwd Commands - 模擬 Shell 路徑操作

     編輯:C++ 入門

題目要求

實現簡易 Shell 的 cd 與 pwd 指令:

  • cd <path>:支援絕對路徑(以 / 開頭)、相對路徑、..(上層目錄)
  • pwd:輸出當前絕對路徑,結尾必須有 /

核心邏輯

  • 維護 string path,初始 "/"
  • cd 時逐段解析路徑字串:.. 彈出上層目錄,普通目錄名 push_back
  • 處理結尾 / 確保格式統一

參考程式碼 (C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n; cin >> n;
    string path = "/", cmd, arg;
    while (n--) {
        cin >> cmd;
        if (cmd == "pwd") {
            cout << path << '\n';
        } else { // cd
            cin >> arg;
            if (arg[0] == '/') path = "/"; // 絕對路徑重置
            for (size_t i = (arg[0]=='/'); i < arg.size(); ) {
                if (arg[i] == '.') { // 處理 ..
                    if (path.size() > 1 && path.back() == '/') path.pop_back();
                    while (!path.empty() && path.back() != '/') path.pop_back();
                    i += 2; // 跳過 ".."
                    if (i < arg.size() && arg[i] == '/') ++i;
                } else { // 普通目錄
                    while (i < arg.size() && arg[i] != '/')
                        path.push_back(arg[i++]);
                    if (i < arg.size() && arg[i] == '/') ++i;
                }
            }
            if (path.empty() || path.back() != '/') path.push_back('/');
        }
    }
    return 0;
}

關鍵細節

  • 路徑字串始終保持「以 / 開頭、以 / 結尾」的規範形式
  • .. 處理時需防禦根目錄不再上溯
  • 使用 string 直接操作比 vector<string> 更簡潔

複雜度

  • 每指令 O(L),L 為路徑長度
  • 總時間 O(總輸入長度)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved