[C ++] - explicaciones simplificadas de los bovinos fuera del camino de estilo Unix

título Descripción

Aquí Insertar imagen Descripción
(Acabo de ver esta pregunta, mi mente es de Mongolia, y no deje que nosotros sabemos que hacer, pero más tarde se encontró que con un poco de Linux o relación) La siguiente es la idea (aunque muy larga, pero la solución de la vaca es fácil de entender ):

1, / indica el directorio raíz, Linux / uinx estructura de directorios es un árbol, es decir, la raíz de la raíz del árbol, es imposible continuar con el alza.
2,. Representa el directorio actual.
3, ... indican el directorio padre.
4, / también se utiliza para la partición entre directorios, como / a / b b representa la ruta de una trayectoria en el directorio raíz; a / b b representa un camino de la ruta del directorio actual.
5, / delimitador cuando se utiliza, el número puede ser más o menos, y como // una ///// b / a / b es el mismo. Nota // un ///// B y A / B no es la misma, ya que el primero tiene un directorio raíz. End / sin sentido, tal como a / b y a / b / es el mismo.

Podemos empujar la pila de salida de simular en el Catálogo de directorios, pero no aplicar el STL pila porque sólo pila secuencial de salida desde la parte superior de la pila, tratamiento de billetes problemas, por lo que el uso de vectores. Un ret variable temporal, para el ahorro de carácter entre dos /.
1, si ret == "" No hacer nada
2, si ret == "..." pop
3, de lo contrario, la pila ret.

Advertencias:
1. Determinar la pila antes de que la pila no está vacía, porque en Linux, Unix, comando cd / ... / ... / es legal, el resultado es en el directorio raíz, no es posible en el ascendente.
2, antes de que la pila se va a determinar si una cadena str blanco, // similares para excluir porque este caso es un ///// b.
3, el resultado final, si la pila está vacía, sino también una salida /

código:

#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;
}

Captura resultado:
Aquí Insertar imagen Descripción
Creo que esta pregunta es muy interesante, registrada por primera vez

Publicado 42 artículos originales · alabanza ganado 13 · vistas 1765

Supongo que te gusta

Origin blog.csdn.net/Vicky_Cr/article/details/105270491
Recomendado
Clasificación