[C ++] - UNIXスタイルのパスオフ牛の簡略説明

タイトル説明

ここに画像を挿入説明
(ただ、私の心はモンゴルで、この質問を見て、私たちは彼がやって知らせていませんが、少し後の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;
}

スクリーンショットの結果:
ここに画像を挿入説明
私が思うに、この質問は、まず非常に興味深い記録されています

公開された42元の記事 ウォン称賛13 ビュー1765

おすすめ

転載: blog.csdn.net/Vicky_Cr/article/details/105270491