¿Cómo podemos implementar las funciones de deshacer y rehacer en una cola de doble final?

¿Cómo podemos implementar las funciones de deshacer y rehacer en una cola de doble final?

Dado que la expectativa general es que:

  • deshacemos las acciones en el orden inverso en que se realizaron, y
  • rehacemos acciones que deshacemos también en el orden inverso,

La estructura de datos canónicos para almacenar el estado de deshacer y rehacer es una pila en lugar de una cola de doble extremo ( deque ). Por supuesto, debe usar pilas separadas para deshacer y rehacer información, y simplemente transferir elementos entre ellos, es decir:

  • cada nueva acción que hagas se inserta en la pila de deshacer,
  • cada deshacer saca un elemento de la pila de deshacer y lo empuja a la pila de rehacer,
  • cada rehacer saca un elemento de la pila de rehacer y lo empuja a la pila de deshacer.

Dicho esto, puede usar fácilmente una deque para emular una pila, simplemente agregando y eliminando elementos del mismo extremo de la cola.

El uso de un deque para la pila de deshacer tiene la ventaja adicional de que puede elegir recortar la pila cuando se llena demasiado (por ejemplo, puede limitar las deshacer a las últimas 1,000 acciones). Recortar la pila solo significa eliminar elementos del extremo opuesto desde el que los inserta.

More Interesting

Cómo determinar la complejidad de esta recurrencia T (n) = 16 * T (n / 4) + n! usando el teorema maestro

¿Cuál es la forma más eficiente de restar una lista de otra?

¿Qué son las estructuras de datos y los algoritmos en c ++?

¿Qué debo hacer después de aprender Java central y resolver problemas de algoritmos y estructura de datos en HackerRank, CodeChef, etc.?

¿Cuál es la solución a la siguiente relación de recurrencia: [matemáticas] T (n) = 3T (n-1) - 7T (n-2) + 9T (n-3) [/ matemáticas], con las siguientes condiciones iniciales: [ matemática] T (0) = 1 [/ matemática], [matemática] T (1) = 6 [/ matemática], [matemática] T (2) = 7 [/ matemática]. ¿Qué es una expresión para [math] T (n) [/ math] de modo que no haya términos [math] T (i (\ frac {n} {j}) ^ {k}) [/ math] a la derecha ¿lado?

¿Qué es la compresión de datos en la base de datos?

Cómo calcular óptimamente grandes factoriales de orden 10 ^ 5 para operaciones repetidas (por ejemplo, encontrar permutaciones)

¿A qué libro se refirió Thomas Cormen mientras estudiaba algoritmos?

Cómo encontrar la longitud máxima de la submatriz en una matriz determinada

¿Hay números irracionales de distribución uniforme no repetitivos para los cuales el dígito n puede calcularse en O (1) tiempo?

¿Qué es un algoritmo para el reemplazo de página (memoria virtual) LRU y FIFO?

¿Qué debe aprender primero, algoritmos y DS o un lenguaje de programación?

Se dan N nodos idénticos. ¿Cuántos árboles binarios son posibles?

En C, el nombre de la matriz denota la dirección del elemento cero de la matriz. ¿Es esto solo una regla, o tiene alguna razón asociada?

¿Cuál es la comparación en algoritmo de Sieve of Sundaram y Sieve of Eratosthenes con tiempo-complejidad?