03 Esfuerzos Internos en Estructuras Lineales Planas - Presentacion
Estructuras lineales
-
Upload
oswaldo-vazquez -
Category
Documents
-
view
587 -
download
0
Transcript of Estructuras lineales
ESTRUCTURAS LINEALES(LISTAS)
LISTAS
Una lista es una estructura de datos homogénea y dinámica, que va a estar formada por una secuencia de elementos, donde cada uno de ellos va seguido de otro o de ninguno.
OPERACIONES BASICAS CON LISTAS
INSERTAR. La operación insertar consiste en la introducción de un nuevo elemento en la lista.En una lista no ordenada no es necesario mantener ningún orden, por lo tanto la inserción de elementos se puede realizar en cualquier lugar de la lista, al principio, al final, en una posición aleatoria.La operación más sencilla depende de la implementación de la estructura de datos, en unos casos puede ser la inserción al inicio, en otros la inserción al final y en este caso la inserción la realiza en el segundo nodo de la lista.
Si tenemos la lista...
Si insertamos el elemento 0, la lista quedaría de la siguiente forma:
BORRAR. La operación borrar consiste en la eliminación de la lista de un elemento concreto. La eliminación en una lista no conlleva ningún trabajo adicional más que el propio de la eliminación del elemento en sí. Para borrar un elemento cualquiera habría que realizar un recorrido secuencial de la lista hasta encontrar el nodo buscado y una vez localizado reestructurar los punteros para saltarse el nodo a borrar y así poder eliminarlo.
Paso 1: Localizar el elemento a borrar.
Paso 2: Reestructurar punteros y eliminar nodo.
TIPOS DE LISTAS
Listas enlazadas lineales
Listas simples enlazadasLa lista enlazada básica es la lista enlazada simple tiene un enlace por nodo. Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vacía, si es el último nodo.Una lista enlazada simple contiene dos valores: • El valor actual del nodo • Un enlace al siguiente nodo
Lista Doblemente Enlazada
Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazadas de dos vías. Cada nodo tiene dos enlaces: • Uno apunta al nodo anterior, o apunta al valor NULL si
es el primer nodo• Otro que apunta al nodo siguiente, o apunta al
valor NULL si es el último nodo.
Listas enlazadas circulares
En una lista enlazada circular, el primer y el último nodo están unidos juntos. Para recorrer una lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se regrese hasta el nodo original, listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado.
Listas enlazadas circulares simples
Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del último apunta al primero, esto nos permite rápidas inserciones al principio, y también permite accesos al primer nodo desde el puntero del último nodo. 1
LISTAS SIMPLEMENTE ENLAZADAS
La lista enlazada es un TDA que nos permite almacenar datos de una forma organizada, al igual que los vectores pero, a diferencia de estos, esta estructura es dinámica, por lo que no tenemos que saber los elementos que puede contener.
En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen el dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista, suelen recibir también el nombre de nodos de la lista.
struct lista { int dato; lista *siguiente; };
Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores asociados que permitan la manipulación de los datos que contiene. Los operadores básicos de una lista enlazada son:•Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción al principio o final de la lista o bien en orden.•Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.•Buscar: busca un elemento en la lista.•Localizar: obtiene la posición del nodo en la lista.•Vaciar: borra todos los elementos de la lista
LISTAS DOBLEMENTE ENLAZADAS
Son listas que tienen un enlace con el elemento siguiente y con el anterior. Ventaja; Pueden recorrerse en ambos sentidos para efectuar una operación
con cada elemento o para insertar/actualizar y borrar. Las búsquedas son algo más rápidas puesto que no hace falta
hacer referencia al elemento anterior. Desventaja; Su inconveniente es que ocupan más memoria por nodo que una
lista simple.
struct lista_doble { gint dato; lista_doble *siguiente; lista_doble *anterior;
}; I. Representa el dato a almacenar, que puede ser de
cualquier tipo. En este ejemplo se trataría de una lista de enteros.
II. Se trata de un puntero al siguiente elemento de la lista. Con este puntero se enlaza con el sucesor, de forma que podamos construir la lista.
III. Es un puntero al elemento anterior de la lista. Este puntero enlaza con el elemento predecesor de la lista y permite recorrerla en sentido inverso.
Declaración del tipo lista doblemente enlazada
struct GList {gpointer data; GList *next;GList *prev;
};
I. Representa el dato que se va a almacenar. Se utiliza un puntero genérico por lo que puede almacenar un puntero a cualquier tipo de dato o bien almacenar un entero utilizando las macros de conversión de tipos.
II. Se trata de un puntero al siguiente elemento de la lista.III. Se trata de un puntero al elemento anterior de la lista.
Declaración de la estructura
GList
Las listas circulares tienen la característica de que el último elemento de la misma apunta al primeroLa siguiente figura es una representación gráfica de una lista circular.En las listas circulares se pueden realizar las mismas operaciones que en las listas simplemente ligadas, como son:
Insertar elemento en una lista Insertar elemento único Insertar ordenadamente Eliminar elemento Buscar elemento
LISTAS CIRCULARES
public class ListaCircular {
private NodoCircular inicio;
// constructor de listaCircular
public ListaCircular(){
inicio= null ;
}}
Declaración de una lista circular
APLICACIONES
Mediante este mecanismo, podemos construir muchas estructuras de datos enlazadas con listas; esta práctica tiene su origen en el lenguaje de programación Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la única), y ahora es una característica común en el estilo de programación funcional.
A veces, las listas enlazadas son usadas para implementar arrays asociativos, y estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejores formas de implementar éstas estructuras, por ejemplo con árboles binarios de búsqueda equilibrados.
PILAS
Pilas
Estructura de datos lineal donde los elementos pueden ser añadidos o removidos solo por un extremo.
Esta estructura tiene una filosofia LIFO (last-in, first-out), ultimo en entrar, primero en salir
Ejemplos:•Pila de platos.•Pila de monedas.•Pila de discos.
Una pila (stack en inglés) es una lista ordenada o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.
Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.
Representación básica en memoria estática y dinámica
Arreglos (memoria estática)
Una vez definido el tamaño del arreglo no se cambia su tamaño
Listas enlazadas (memoria dinámica)
Se almacenan los elementos como nodos y el tamaño se ajusta exactamente a los elementos de la pila
c
b
a
tope
pila
Max = 5
abc
pilad
tope
Operaciones básicas con pilas.
PUSH (insertar).- Agrega un elementos a la pila en el extremo llamado tope.
-POP (remover).- Remueve el elemento de la pila que se encuentra en el extremo llamado tope.
-VACIA.- Indica si la pila contiene o no contiene elementos.
-LLENA.- Indica si es posible o no agregar nuevos elementos a la pila.
Ejemplo:
Inicio:
Insertar
A:
Tope Null
Insertar
B:
Insertar
C:
Eliminar
Tope
A A
B
Tope
A
B
Tope
C
A
B
Topetope tope tope tope tope
Métodos básicos para implementar la pila son: Pila_llena()
Devuelve verdadero si la pila esta llena Pila_vacia();
Devuelve verdadero si la pila esta vacia Insertar_push (int elem);
Agrega el elemento a la pila Retirar_pop();
Elimina el elemento que esta en la cima de la pila
Notaciones NOTACION INFIJA: es la forma habitual de escribir operacionesaritméticas es la de situar el operador entre sus dosoperandos. El operador se evalúa dentro de losOperandos.Los operadores aparecen en medio de los operandos. A + B, A – 1, E/F, A * C , A + B + CNOTACION PREFIJA: (polaca)El operador aparece antes de los operandos. + AB, - A1, /EF, *AC, ++ABC, +- ABCNOTACION POSTFIJA: (polaca)El operador aparece al final de los operandos. AB+, A1-, EF/, AC*, AB^, AB+C+, AB+C-
Reglas para convertir de infija a posfija o prefija La ventaja de utilizar expresiones en notación
polaca (posfija o prefija) radica en que no son necesarios los paréntesis para indicar el orden de operación, ya que esto queda establecido por la ubicación de los operadores de más alta prioridad se ejecuta primero.
Si hubiera en una expresión 2 o mas operadores de igual precedencia, se procesa de izquierda a derecha.
Las expresiones con paréntesis se ejecutan primero
De infija a prefijaA*B/(A+C) (infija) -> A*B/+AC -> *AB/+AC -> /*AB+AC (prefija)
A*B/A+C -> *AB/A+C -> /*ABA+C -> +/*ABAC
(A-B)ˆC+D -> -ABˆC+D -> ˆ-ABC+D -> +ˆ-ABCD
De infija a postfija
A*B/(A+C) (infija) -> A*B/AC+ -> AB*/AC+ -> AB*AC+/ (postfija)
A*B/A+C -> AB*/A+C -> AB*A/+C -> AB*A/C+
(A-B)ˆC+D -> AB-ˆC+D -> AB-Cˆ+D -> AB-CˆD+
COLAS
Colas
Es una lista lineal de elementos en la que las operaciones de insertar y eliminar se realizan en diferentes extremos de la cola.
Trabajan con filosofía FIFO ( First In - First out), el primer elemento en entrar es el primer elemento en salir.
Cola simple: Estructura lineal donde los elementos salen en el mismo orden en que llegan.
Cola circular: Representación lógica de una cola simple en un arreglo.
Cola Doble: Estructura lineal en la que los elementos se pueden añadir o quitar por cualquier extremo de la cola (cola bidireccional).
Tipos de Colas
Operaciones básicas con colas
Insertar.- Almacena al final de la cola el elemento que se recibe como parámetro.
Eliminar.- Saca de la cola el elemento que se encuentra al frente.
Vacía.- Regresa un valor booleano indicando si la cola tiene o no elementos (true – si la cola esta vacía, false – si la cola tiene al menos un elemento).
Llena.- Regresa un valor booleano indicando si la cola tiene espacio disponible para insertar nuevos elementos ( true – si esta llena y false si existen espacios disponibles).
Representación usando arreglos
Las colas pueden ser representadas en arreglos de una dimensión (vector) manteniendo dos variables que indiquen el FRENTE y FINAL de los elementos de la cola.
A F S D Z
Frente Final
0 1 2 3 4 5
Cuando la cola esta vacía las variables frente y final son nulos y no es posible remover elementos.
Cuando la cola esta llena ( frente = 0 y final = n-1) no es posible insertar elementos nuevos a la cola.
Cola Circular
Es una representación lógica de la cola en un arreglo.
El frente y final son movibles.
Cuando el frente o final llegan al extremo se regresan a la primera posición del arreglo.
C D E
Frente
Final
F C D E
Frente
Final
C D
Frente
Final
B C D
Frente
Final
Remover
Insertar E
Insertar F
Cola inicial