タイトル説明
(ただ、私の心はモンゴルで、この質問を見て、私たちは彼がやって知らせていませんが、少し後のLinuxまたは関係を持つことがわかった)牛のソリューションは、理解しやすいですが、非常に長いが、以下は、(アイデアです):
1 /即ちツリーのルートのルート、リナックス/ uinxディレクトリ構造がツリーで、ルートディレクトリを示し、上方を継続することは不可能です。
2、現在のディレクトリを表します。
3、...親ディレクトリを示しています。
図4に示すように、/また、ディレクトリ間のパーティションのために使用されるような/ A / B Bパスルートディレクトリの下にパスを表し; / B Bカレントディレクトリのパスのパスを表しています。
使用される場合5 /デリミタ、数は、多かれ少なかれこと、および// A ///// B / A / Bと同じであることができます。注// A ///// Bおよび/ bの前者は、ルートディレクトリを持っているので、同じではありません。そのような/ Bおよび/またはBのようなエンド/無意味、/同じです。
私たちは、ディレクトリカタログにシミュレート出口までスタックをプッシュすることができますが、スタックSTLは、スタックの先頭からのみスタック順次出力するので適用されない、ノートのトラブルを処理し、その利用ベクトル。2 /の間の文字を保存するための一時変数RET、。
1、もしRET == ""実行(Do)何も
2、RET == "..."ポップ場合は
3、それ以外の場合は、RETスタックを。
警告:
Linuxでは、UNIX、cdコマンドは、/ ... / ... /合法で1スタックが空でない前にスタックを決定するために、結果はルートディレクトリにあるので、上方では不可能です。
図2に示すように、スタックが空の文字列strか、//この場合は///// bであるので除外と同様に決定される前に。
図3に示すように、最終結果、スタックが空で、しかしある場合、出力A /
コード:
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
using namespace std;
//简化Uinx风格的路径
int main()
{
string str;
while (cin>>str)
{
int i = 0;
int j = 0;
string ret;
vector<string> s;
vector<string> ::iterator it;
for (i = 0; i < str.size(); i++)
{
if (str[i] == '/')
{
j = i + 1;
while (j<str.size()&&str[j] != '/')
{
j++;
}
if (i + 1 < str.size())
{
ret = str.substr(i + 1, j - i - 1);
if (ret == "..") //出栈前判断是否为空
{
if (!s.empty())
{
s.pop_back();
}
}
else if (ret == ".")
{
; //什么也不做
}
else if (!ret.empty()) //入栈之前看其截取的是否为空
{
s.push_back(ret);
}
}
}
i = j - 1;
}
if (s.empty()) //如果是空的就输出"/"
{
cout << "/" << endl;
}
else
{
for (it = s.begin(); it != s.end(); ++it)
{
cout << "/" << *it << endl;
}
}
}
system("pause");
return 0;
}
スクリーンショットの結果:
私が思うに、この質問は、まず非常に興味深い記録されています