Sei sulla pagina 1di 11

INSTITUTO TECNOLÓGICO SUPERIOR DE

HOPELCHÉN

NOMBRE DEL ALUMNO:


ANDREI ALEXANDER HOO CHAN

PROFESOR:
ANTONIO ARMANDO PRESUEL ROSADO

ASIGNATURA:
ESTRUCTURA DE DATOS

CARRERA:
INGENIERÍA EN SISTEMAS COMPUTACIONALES

FECHA DE ENTREGA:
11/NOVIEMBRE/2018

MATRÍCULA: 5876
GRADO: 3 A GRUPO: 3er SEMESTRE
1- Pilas.
Una pila (stack) es una colección ordenada de elementos a los que sólo se puede
acceder por un único lugar o extremo. Los elementos de la pila se añaden o quitan
(borran) de la misma sólo por su parte superior, la cima de la pila. Éste es el caso
de una pila de platos, una pila de libros, etc.

Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.


McGraw Hill. Páginas: 311

2- Representación de pilas mediante arreglos y apuntadores (listas enlazadas).

La realización dinámica de una pila utilizando


una lista enlazada almacena cada elemento de
la pila como un nodo de la lista. Como las
operaciones de insertar y extraer en el TAD
Pila se realizan por el mismo extremo (cima de
la pila), las acciones correspondientes con la
lista se realizarán siempre por el mismo
extremo de la lista.
Esta realización tiene la ventaja de que el
tamaño se ajusta exactamente al número de
elementos de la pila. Sin embargo, para cada
elemento es necesaria más memoria para
guardar el campo de enlace entre nodos consecutivos. La estructura que tiene la
pila implementada con una lista enlaza es muy similar a la expuesta en listas
enlazadas. Los elementos de la pila son los nodos de la lista, con un atributo para
guardar el elemento y otro de enlace. Las operaciones del tipo pila implementada
con listas son, naturalmente, las mismas que si la pila se implementa con arrays,
salvo la operación que controla si la pila está llena, pilaLlena, que ahora no tiene
significado ya que la lista enlazadas crecen indefinidamente, con el único límite de
la memoria.

Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.


McGraw Hill. Páginas: 321

3- Operaciones con estructuras tipo pila.


-La operación de insertar un elemento en la pila, incrementa el apuntador cima y
asigna el nuevo elemento a la lista. Cualquier intento de añadir un elemento en
una pila llena genera. Una excepción o error debido al “Desbordamiento de la pila”.
-La operación quitar elimina un elemento de la pila copiando, en primer lugar, el
valor de
la cima de la pila en una variable local, aux, y a continuación, decrementa el
puntero de la pila quitar() devuelve la variable aux, es decir, el elemento eliminado
por la operación. Si se intenta eliminar o borrar un elemento en una pila vacía se
produce error, se lanza una excepción.
-La operación cimaPila devuelve el elemento que se encuentra en la cima de la
pila, no se modifica la pila, únicamente accede al elemento.
Se debe proteger la integridad de la pila, para lo cual el tipo Pila ha de
proporcionar operaciones que comprueben el estado de la pila: pila vacía o pila
llena.
-Asimismo, se ha de definir una operación, LimpiarPila, que restaure la condición
inicial de la pila, cima igual a -1.
-La función pilaVacia comprueba si la cima de la pila es -1. En cuyo caso la pila
está vacía y devuelve verdadero.
-La función pilaLlena comprueba si la cima es TAMPILA-1; en cuyo caso la pila
está llena y devuelve verdadero.

Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.


McGraw Hill. Páginas: 317-319

4- Usos y aplicaciones de las pilas.


-La evaluación de una expresión aritmética escrita de manera habitual, en notación
infija, se realiza en dos pasos principales:
1.º Transformar la expresión de notación infija a postfija.
2.º Evaluar la expresión en notación postfija.
El TAD Pila es fundamental en los algoritmos que se aplican a cada uno de los
pasos. El orden que fija la estructura pila asegura que el último en entrar es el
primero en salir, y de esa forma el algoritmo de transformación a postfija sitúa los
operadores después de sus operandos, con la prioridad o precedencia que le
corresponde. Una vez que se tiene la expresión en notación postfija, se utiliza otra
pila, de elementos numéricos, para guardar los valores de los operandos, y de las
operaciones parciales con el fin de obtener el valor numérico de la expresión.
Se parte de una expresión en notación infija que tiene operandos, operadores y
puede tener paréntesis. Los operandos se representan con letras, los operadores
son éstos:
^ (potenciación), *, /, +, - .
La transformación se realiza utilizando una pila para guardar operadores y los
paréntesis izquierdos. La expresión aritmética se lee del teclado y se procesa
carácter a carácter. Los operandos pasan directamente a formar parte de la
expresión en postfija la cual se guarda en un array. Un operador se mete en la pila
si se cumple que:
La pila esta vacía, o el operador tiene mayor prioridad que el operador cima de la
pila, o bien, el operador tiene igual prioridad que el operador cima de la pila y se
trata de la máxima prioridad. Si la prioridad es menor o igual que la de cima pila,
se saca el elemento cima de la pila, se pone en la expresión en postfija y se vuelve
a hacer la comparación con el nuevo elemento cima. El paréntesis izquierdo
siempre se mete en la pila; ya en la pila se les considera de mínima prioridad para
que todo operador que se encuentra dentro del paréntesis entre en la pila. Cuando
se lee un paréntesis derecho se sacan todos los operadores de la pila y pasan a la
expresión postfija, hasta llegar a un paréntesis izquierdo que se elimina ya que los
paréntesis no forman parte de la expresión postfija. El algoritmo termina cuando no
hay más items de la expresión origen y la pila está vacía. Por ejemplo, dada la
expresión a*(b+c-(d/e^f)-g)-h escrita en notación infija, a continuación,
se va a ir formando, paso a paso, la expresión equivalente en postfija.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 329

5- Colas.
Una cola es una estructura de datos que
almacena elementos en una lista y el acceso a
los datos se hace por uno de los dos extremos
de la lista. Un elemento se inserta en la cola
(parte final) de la lista y se suprime o elimina por
el frente (parte inicial, frente) de la lista. Las
aplicaciones utilizan una cola para almacenar elementos en su orden de aparición
o concurrencia.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 340

6- Representación de colas mediante arreglos y apuntadores (listas enlazadas).


La implementación estática se realiza declarando un array para almacenar los
elementos, y dos marcadores o apuntadores para mantener las posiciones frente y
final de la cola; es decir, un marcador apuntando a la posición de la cabeza de la
cola y el otro al primer espacio vacío que sigue al final de la cola. Cuando un
elemento se añade a la cola, se verifica si el marcador final apunta a una posición
válida, entonces se asigna el elemento en esa posición y se incrementa el
marcador final en 1. Cuando un elemento se elimina de la cola, se hace una
prueba para ver si la cola está vacía y, si no es así, se recupera el elemento de la
posición apuntada por el marcador (puntero) de cabeza y éste se incrementa en 1.
La operación de poner un elemento inserta por el extremo final. La primera
asignación se realiza en la posición final = 0, cada vez que se añade un nuevo
elemento se incrementa final en 1 y se asigna el elemento. La extracción de un
elemento se hace por el extremo contrario, frente, cada vez que se extrae un
elemento avanza frente una posición.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 342

7- Operaciones con estructuras tipo cola.


Las operaciones usuales en las colas son Insertar y Quitar.
-La operación Insertar añade un elemento por el extremo final de la cola, y la
operación Quitar elimina o extrae un elemento por el extremo opuesto, el frente o
primero de la cola. La organización de elementos en forma de cola asegura que el
primero en entrar es el primero en salir.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 341
8- Colas circulares.
La alternativa, sugerida en la operación quitar un
elemento, de desplazar los restantes elementos del
array de modo que la cabeza de la cola vuelva al
principio del array, es costosa, en términos de tiempo
de computadora, especialmente si los datos
almacenados en el array son estructuras de datos
grandes. La forma más eficiente de almacenar una cola
en un array es modelar éste de tal forma que se una el
extremo final con el extremo cabeza. Tal array se
denomina array circular y permite que la totalidad de
sus posiciones se utilicen para almacenar elementos de la cola sin necesidad de
desplazar elementos. El array se almacena de modo natural en la memoria, como
un bloque lineal de n elementos.
Se necesitan dos marcadores (apuntadores) frente y final para indicar,
respectivamente, la posición del elemento cabeza y la posición donde se
almacenó el último elemento puesto en la cola.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 345

9- Cola doble (bicola).


Una bicola o cola de doble entrada es un conjunto ordenado de elementos al que
se puede añadir o quitar elementos desde cualquier extremo del mismo. El acceso
a la bicola está permitido desde cualquier extremo, por lo que se considera que es
una cola bidireccional. La estructura bicola es una extensión del TAD Cola. Los
dos extremos de una bicola se identifican con los apuntadores frente y final
(mismos nombres que en una cola).
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 354

10- Colas de prioridad.


El término cola sugiere la forma en que ciertos objetos esperan la utilización de un
determinado servicio. Por otro lado, el término prioridad sugiere que el servicio no
se proporciona únicamente aplicando el concepto “primero en llegar primero en ser
atendido” sino que cada objeto tiene asociado una prioridad basada en un criterio
objetivo. La cola de prioridad es una estructura ordenada que se utiliza para
guardar elementos en un orden establecido. El orden para extraer un elemento de
la estructura sigue estas reglas:
-Se elige la cola no vacía que se corresponde con la mayor prioridad.
-En la cola de mayor prioridad los elementos se procesan según el orden de
llegada: primero en entrar primero en salir. Las Colas de prioridad son muy
importantes en la implementación de algoritmos ávidos y en la simulación de
eventos. Un ejemplo de organización formando colas de prioridades es el sistema
de tiempo compartido, necesario para mantener una serie de procesos que
esperan ser ejecutados por el procesador; cada proceso lleva asociado una
prioridad, de tal manera que se ejecuta siempre el proceso de mayor prioridad, y
dentro de la misma prioridad, aquel proceso que primero llega. Otro posible
ejemplo que se realiza con una cola de prioridad es la simulación de sucesos que
ocurren en un tiempo discreto, como es la atención de una fila de clientes en un
sistema de n ventanillas de despacho de billetes de transporte.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 366

11- Usos y aplicaciones de las colas.


En un sistema de tiempo compartido suele haber un procesador central y una serie
de periféricos compartidos: discos, impresoras, etc. Los recursos se comparten por
los diferentes usuarios y se utiliza una cola para almacenar los programas o
peticiones de los diferentes usuarios que esperan su turno de ejecución. El
procesador central atiende —normalmente— por riguroso orden de llamada del
usuario; por tanto, todas las llamadas se almacenan en una cola. Existe otra
aplicación muy utilizada que se denomina cola de prioridades; en ella el
procesador central no atiende por riguroso orden de llamada, aquí el procesador
atiende por prioridades asignadas por el sistema o bien por el usuario, y sólo
dentro de las peticiones de igual prioridad se producirá una cola.
Fundamentos de programacion. Algoritmos, estructura de datos y objetos. -
Luis Joyanes Aguilar (4ª edición). Páginas 461

12- Nodos de una lista.


Las estructuras dinámicas de datos están formadas por nodos.
Un nodo es una variable dinámica constituida por al menos dos campos:
• el campo dato o valor (elemento);
• el campo enlace, en este caso de tipo puntero (sig).
Fundamentos de programacion. Algoritmos, estructura de datos y objetos. -
Luis Joyanes Aguilar (4ª edición). Páginas 437

13- Representación de un nodo de lista.

Fundamentos de programacion. Algoritmos, estructura de datos y objetos. -


Luis Joyanes Aguilar (4ª edición). Páginas 437

14- Listas simplemente ligadas.


En la sección anterior se ha desarrollado una estrategia para la resolución de
colisiones que, de una manera o de otra, forma una secuencia de posiciones a
explorar. Una alternativa a la secuencia de exploración es el direccionamiento
(hashing) enlazado. Se basa en utilizar listas enlazadas (cadenas de elementos),
de tal forma que en cada lista se colocan los elementos que tienen la misma
dirección hash. Todos los elementos que colisionan: h(x1) = h(x2) = = h(x3) ... van
a estar ubicados en la misma lista enlazada.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 423

15- Operaciones con estructuras tipo lista simplemente enlazadas.


Las operaciones fundamentales que se realizan con tablas dispersas, insertar,
buscar y eliminar, se convierten, una vez obtenido el índice de la tabla con la
función hash, en operaciones sobre listas enlazadas. Para añadir un elemento a la
tabla cuya clave es x, se inserta en la lista de índice h(x).
Puede ocurrir que la lista esté vacía, no se almacenó elemento con esa dirección
dispersa, o bien que ya tenga elementos. En cualquier caso, la inserción en la lista
se hace como primer elemento, de esa forma el tiempo de ejecución es de
complejidad constante; entonces, se puede afirmar que la complejidad de la
operación inserción es O(1).
Ahora, un elemento de la tabla puede eliminarse físicamente, no es necesario
marcar el elemento como no activo, como ocurre con las secuencias de
exploración. Los pasos a seguir, primero se obtiene el índice de la tabla, h(x), a
continuación, se aplica la operación eliminar un nodo de una lista enlazada.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 423

16- Representación de listas simplemente enlazadas mediante arreglos y


apuntadores.
Primero vamos a declarar una variable apuntador llamada cabeza, que apunte a la
cabeza de nuestra lista enlazada:
NodoPtr cabeza;
Para crear nuestro primer nodo utilizamos el operador new para crear una nueva
variable dinámica que se convertirá en el primer nodo de nuestra lista enlazada.
cabeza = new Nodo;
Ahora asignamos valores a las variables miembro de este nuevo nodo:
cabeza>datos = 3;
cabeza>enlace = NULL;
Observe que el miembro apuntador de este nodo se hace igual a NULL. Esto se
debe a que este nodo es el último de la lista (así como el primer nodo en la lista).
En esta etapa, nuestra lista enlazada se ve así:

Savitch, W. (2007), Resolución de problemas con C++. Quinta edición.


Pearson.
Páginas: 736
17- Algoritmo y representación de las operaciones insertar y eliminar en listas
simplemente enlazadas.

18-

void inserta(NodoPtr despues_demi, int el_numero);


//Precondición: despues_demi apunta a un nodo en una lista enlazada.
//Postcondición: se ha agregado un nuevo nodo que contiene el_numero
//después del nodo al que apunta despues_demi.
Un nuevo nodo se establece de la misma forma que en la función
insercion_cabeza del cuadro. La diferencia entre esta función y la del cuadro 15.4
es que ahora deseamos insertar el nodo no en la cabeza de la lista, sino después
del nodo al que apunta
despues_demi. En el cuadro 15.8 se muestra cómo realizar la inserción, que se
expresa en
código de C++ a continuación:
//agrega un enlace del nuevo nodo a la lista:
temp_ptr>enlace = despues_demi>enlace;
//agrega un enlace de la lista al nuevo nodo:
despues_demi>enlace = temp_ptr;
Savitch, W. (2007), Resolución de problemas con C++. Quinta edición.
Pearson.
Páginas: 748

19- Listas circulares.


En las listas lineales simples o en las dobles siempre hay un primer nodo (cabeza)
y un último nodo (cola). Una lista circular, por propia naturaleza, no tiene ni
principio ni fin. Sin embargo, resulta útil establecer un nodo de acceso a la lista y,
a partir de él, al resto de sus nodos.

Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.


McGraw Hill. Páginas: 299

20- Listas doblemente enlazadas.


Hasta ahora el recorrido de una lista se ha realizado en sentido directo (adelante).
Existen numerosas aplicaciones en las que es conveniente poder acceder a los
nodos de una lista en cualquier orden, tanto hacia adelante como hacia atrás.
Desde un nodo de una lista doblemente enlazada se puede avanzar al siguiente, o
bien retroceder al nodo anterior. Cada nodo de una lista doble tiene tres campos,
el dato y dos punteros, uno apunta al siguiente nodo de la lista y el otro al nodo
anterior.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 293

21- Algoritmo y representación de las operaciones insertar y eliminar en listas


doblemente enlazadas.
La clase ListaDoble encapsula las operaciones básicas de las listas doblemente
enlazadas.
La clase dispone del puntero variable cabeza para acceder a la lista, apunta al
primer nodo.
El constructor de la clase inicializa la lista vacía.
Se puede añadir nodos a la lista de distintas formas, según la posición donde se
inserte. La posición de inserción puede ser:
􀁵􀁵En cabeza de la lista.
􀁵􀁵Al final de la lista.
Insertar por la cabeza
El proceso sigue estos pasos:
1. Crear un nodo con el nuevo elemento.
2. Hacer que el campo adelante del nuevo nodo apunte a la cabeza (primer nodo)
de la lista original, y que el campo atrás del nodo cabeza apunte al nuevo nodo.
3. Hacer que cabeza apunte al nodo creado.
Insertar después de un nodo
El algoritmo de la operación que inserta un nodo después de otro, n, requiere las
siguientes
etapas:
1. Crear un nodo, nuevo, con el elemento.
2. Poner el enlace adelante del nodo creado apuntando al nodo siguiente de n. El
enlace
atras del nodo siguiente a n (si n no es el último nodo) tiene que apuntar a nuevo.
3. Hacer que el enlace adelante del nodo n apunte al nuevo nodo. A su vez, el
enlace
atras del nuevo nodo debe de apuntar a n.

Quitar un nodo de una lista doble supone ajustar los enlaces de dos nodos, el
nodo anterior con el nodo siguiente al que se desea eliminar. El puntero adelante
del nodo anterior debe apuntar al nodo siguiente, y el puntero atras del nodo
siguiente debe apuntar al nodo anterior.
El algoritmo es similar al del borrado para una lista simple, más simple, ya que
ahora la dirección del nodo anterior se encuentra en el campo atras del nodo a
borrar. Los pasos a seguir:
1. Búsqueda del nodo que contiene el dato.
2. El puntero adelante del nodo anterior tiene que apuntar al puntero adelante del
nodo a eliminar (si no es el nodo cabecera).
3. El puntero atras del nodo siguiente a borrar tiene que apuntar a donde apunta el
puntero atras del nodo a eliminar (si no es el último nodo).
4. Si el nodo que se elimina es el primero, se modifica cabeza para que tenga la
dirección del nodo siguiente.
5. La memoria ocupada por el nodo es liberada.
Joyanes, L., Zahonero, I. (2007) Estructura de datos en C++. Primera edición.
McGraw Hill. Páginas: 294-296

22- Listas doblemente enlazadas circulares.


Las listas circulares doblemente enlazadas son una variante de las anteriores. En
este tipo de lista, el primer nodo tiene como nodo predecesor al último y este tiene
como nodo sucesor al primero.

Guardati, S. Estructura de Datos Orientada a Objetos Algoritmos con C++.


Primera edición. Páginas: 293.

23- Usos y aplicaciones de las listas.


De las aplicaciones más conocidas de las listas son las siguientes:
Representación de polinomios: Las listas se pueden emplear para almacenar los
coeficientes diferentes de cero del polinomio, junto al exponente.
Resolución de colisiones (hash): con él se pueden evitar la reiteración y la
redundancia de la información.
Cairo, O. y Guardati, S. Estructura de Datos, Tercera Edición. Páginas: 170.

Potrebbero piacerti anche