Saltar al contenido

Dos índices que dan la vuelta

Un buffer circular es un array de capacidad fija con dos números: inicio (dónde está el frente) y longitud (cuántos hay). La posición del final se calcula, dando la vuelta al llegar al borde:

Texto
encolar(x):    datos[(inicio + longitud) mod capacidad] ← x;  longitud ← longitud + 1desencolar():  x ← datos[inicio];  inicio ← (inicio + 1) mod capacidad;  longitud ← longitud − 1

a mod b es el resto de dividir a entre b: 5 mod 4 = 1. Hace que el índice vuelva a 0 al pasar del final.

Con capacidad 4, empiezas vacío (inicio 0). Encolas A, B, C; desencolas dos veces; encolas D y E. Predice dónde cae E antes de mirar la figura de abajo.

Buffer circular de capacidad 4, paso a pasoCinco pasos con cuatro celdas de índices 0 a 3. Paso 1: vacío, inicio 0, longitud 0. Paso 2: A, B, C en las posiciones 0, 1, 2; longitud 3. Paso 3: tras desencolar dos veces, inicio 2 y longitud 1; solo C cuenta. Paso 4: D va a la posición 3; longitud 2. Paso 5: E va a la posición 0 porque (2 + 2) mod 4 = 0; la cola, de inicio 2, es C, D, E; longitud 3.Paso 1 de 5: vacía0123iniciolongitud = 0Paso 2 de 5: encolas A, B, CA*0B*1C*23iniciolongitud = 3Paso 3 de 5: desencolas dos vecesA0B1C23iniciolongitud = 1Paso 4 de 5: encolas DA0B1C2D*3iniciolongitud = 2Paso 5 de 5: encolas EE*01C2D3iniciolongitud = 3(2 + 2) mod 4 = 0Cómo leer*recién escritofuera de la cola (queda el valor viejo)libre
Las posiciones 0 y 1 del paso 3 conservan los valores A y B, pero ya no pertenecen a la cola. En el paso 5 el final da la vuelta: es el mismo array.
Un buffer circular de capacidad 5 empieza vacío con inicio 0. Encolas A, B, C y D, desencolas tres veces y encolas E, F y G. ¿Cuánto valen inicio y longitud, y en qué posición del array está G?