class RLE
{
// La clase RLE no tiene campos.
// Los objetos de la clase sieven para ejecutar los métodos "Codifica"
// y "Descodifica" (esta implementación se diferencia muy poco de escribir
// los dos métodos como funciones globales).
private:
public:
/***********************************************************************/
// Codifica una secuencia de enteros según el código RLE y devuelve
// otra secuencia de enteros codificada.
//
// Recibe: secuencia_descodificada, la secuencia que se va a codificar.
// Devuelve: una nueva secuencia, resultado de codificar según RLE
// la secuencia recibida "secuencia_descodificada".
SecuenciaEnteros Codifica (SecuenciaEnteros secuencia_descodificada)
{
// Secuencia resultado de la codificación
SecuenciaEnteros secuencia_codificada;
int tope, actual, anterior, iguales_hasta_ahora;
// Registrar la longitud de la secuencia
tope = secuencia_descodificada.TotalUtilizados();
// Guardar el primer valor de la secuencia
actual = secuencia_descodificada.Elemento(0);
iguales_hasta_ahora = 1;
for (int pos=1; pos<tope; pos++) {
anterior = actual;
actual = secuencia_descodificada.Elemento(pos);
if (anterior == actual)
iguales_hasta_ahora++; // Continua la serie
else {
// Añade la pareja (valor, num.repeticiones)
secuencia_codificada.Aniade(iguales_hasta_ahora);
secuencia_codificada.Aniade(anterior);
iguales_hasta_ahora = 1; // empezar una nueva serie
}
} // for (int pos=1; pos<tope; pos++)
// Añade la última pareja (valor, num.repeticiones)
secuencia_codificada.Aniade(iguales_hasta_ahora);
secuencia_codificada.Aniade(actual);
return (secuencia_codificada);
}
/***********************************************************************/
// Descodifica una secuencia de enteros según el código RLE y devuelve
// otra secuencia de enteros descodificada.
//
// Recibe: secuencia_codificada, la secuencia que se va a descodificar.
// Devuelve: una nueva secuencia, resultado de descodificar según RLE
// la secuencia recibida "secuencia_codificada".
SecuenciaEnteros Descodifica (SecuenciaEnteros secuencia_codificada)
{
// Secuencia resultado de la descodificación
SecuenciaEnteros secuencia_descodificada;
// Registrar el número de elementos de la secuencia codificada.
int tope = secuencia_codificada.TotalUtilizados();
// Ciclo que recorre la secuencia codificada.
// La longitud de la secuencia es par (está formada por parejas) así
// que el número de parejas es justo la mitad del número de elementos.
// Observad que el salto se realiza de 2 en 2 porque en cada iteración
// se procesa una pareja.
for (int pos=0; pos<tope; pos+=2) {
int num_repeticiones = secuencia_codificada.Elemento(pos);
int valor = secuencia_codificada.Elemento(pos+1);
// Cada pareja es (num_repeticiones, valor). Se trata de escribir
// "valor" en la secuencia descodificada "num_repeticiones" veces.
for (int i=0; i<num_repeticiones; i++)
secuencia_descodificada.Aniade(valor);
}
return (secuencia_descodificada);
}
/***********************************************************************/
};