31.12.2014 Views

Tipos de Datos Abstractos - TramixSakai ULP

Tipos de Datos Abstractos - TramixSakai ULP

Tipos de Datos Abstractos - TramixSakai ULP

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Introducción a la Programación – Parte 10 – <strong>Tipos</strong> <strong>de</strong> <strong>Datos</strong> <strong>Abstractos</strong><br />

<strong>Tipos</strong> <strong>de</strong> <strong>Datos</strong> <strong>Abstractos</strong><br />

A continuación se exploran algunos tipos <strong>de</strong> datos abstractos fundamentales. Se estudiaran listas,<br />

que son secuencias <strong>de</strong> elementos, y dos tipos especiales <strong>de</strong> listas: las pilas, don<strong>de</strong> los elementos<br />

se insertan y eliminan en un solo extremo, y las filas, don<strong>de</strong> los elementos se insertan por un<br />

extremo y se eliminan por el otro.<br />

Lista<br />

Las listas constituyen una estructura flexible en particular, porque pue<strong>de</strong>n crecer y acortarse<br />

según se requiera; los elementos son accesibles y se pue<strong>de</strong>n insertar y suprimir elementos en<br />

cualquier posición <strong>de</strong> la lista. Las listas también pue<strong>de</strong>n concatenarse (unirse) entre si o<br />

subdividirse. Para darle forma <strong>de</strong> tipo <strong>de</strong> dato abstracto a este concepto, se pue<strong>de</strong> <strong>de</strong>finir el tipo<br />

LISTA y un conjunto <strong>de</strong> operaciones (funciones) para manipularlas.<br />

Definición <strong>de</strong>l Tipo Lista<br />

const int MAX = 1024;<br />

type<strong>de</strong>f struct LISTA<br />

{<br />

int elementos[MAX];//representa los elementos<br />

int posicion;//indica la posición actual<br />

int cantidad;//indica la cantidad <strong>de</strong> elementos<br />

};<br />

La anterior es una <strong>de</strong>finición <strong>de</strong>l tipo LISTA usando una estructura y un arreglo. El tipo <strong>de</strong>l arreglo<br />

<strong>de</strong>finirá el tipo <strong>de</strong> la lista, en este caso es <strong>de</strong> enteros. Este tipo <strong>de</strong> listas implementadas con<br />

arreglos, tienen una capacidad máxima (indicada con la constante MAX). Existe otro tipo <strong>de</strong><br />

implementación utilizando punteros pero no será analizado en este curso.<br />

Operaciones <strong>de</strong> la Lista<br />

La i<strong>de</strong>a básica <strong>de</strong> usar estas representaciones es encapsular las operaciones con funciones que<br />

pi<strong>de</strong>n como principal parámetro el objeto (en este caso una LISTA) y así no tener que lidiar con la<br />

implementación interna <strong>de</strong> dicho objeto. Por ejemplo si queremos insertar un elemento, pasamos<br />

la lista, el elemento y la posición, y es la función la encargada <strong>de</strong> saber como <strong>de</strong>be realizarse la<br />

inserción. Otras operaciones principales incluyen:<br />

<br />

<br />

<br />

Suprimir: elimina un elemento en la posición dada.<br />

Buscar: <strong>de</strong>vuelve la primera posición <strong>de</strong> un elemento en la lista o -1 si no existe.<br />

Recuperar: recupera el elemento actual <strong>de</strong> la lista, aquel en la posición indicada por<br />

“posicion”.<br />

Olimpiadas Sanluiseñas <strong>de</strong>l Conocimiento en Informática – <strong>ULP</strong><br />

Mariano Luzza – Coordinador


Introducción a la Programación – Parte 10 – <strong>Tipos</strong> <strong>de</strong> <strong>Datos</strong> <strong>Abstractos</strong><br />

Existen otras operaciones que permiten preguntar o <strong>de</strong>volver la cantidad <strong>de</strong> elementos y la<br />

posición actual <strong>de</strong> la lista. También para avanzar, retroce<strong>de</strong>r y colocar al principio la posición <strong>de</strong> la<br />

lista. Cabe <strong>de</strong>stacar que con las operaciones avanzar y retroce<strong>de</strong>r es posible “caerse” <strong>de</strong> la lista,<br />

porque el índice <strong>de</strong> posicionamiento podría valer -1 o lo mismo que “cantidad”, con lo que en<br />

ambos casos no se podría recuperar el elemento actual. Esto es para facilitar la iteración sobre la<br />

lista, pero una llamada a retroce<strong>de</strong>r o avanzar ya fuera <strong>de</strong> rango daría error.<br />

Con este conjunto <strong>de</strong> operaciones es posible recorrer una lista. A continuación se muestra la<br />

implementación <strong>de</strong> la operación “Insertar” y un ejemplo para mostrar una lista. El resto <strong>de</strong> las<br />

operaciones se encuentran en un archivo <strong>de</strong> código fuente <strong>de</strong>nominado “lista.cpp”.<br />

//inserta un elemento en la lista en la posicion indicada<br />

void Insertar(LISTA& lista, int elemento, int pos)<br />

{<br />

if(lista.cantidad == MAX) //esta llena<br />

cout


Introducción a la Programación – Parte 10 – <strong>Tipos</strong> <strong>de</strong> <strong>Datos</strong> <strong>Abstractos</strong><br />

Pila<br />

Una pila es un tipo especial <strong>de</strong> lista en la que las inserciones y las supresiones tienen lugar en un<br />

extremo <strong>de</strong> la lista, <strong>de</strong>nominado tope. A las pilas se les suele llamar también, listas “LIFO” (last in,<br />

first out) o listas “último en entrar, primero en salir”. El mo<strong>de</strong>lo intuitivo <strong>de</strong> una pila es<br />

precisamente una pila <strong>de</strong> sillas, <strong>de</strong> libros o <strong>de</strong> platos, don<strong>de</strong> en todos los casos es conveniente<br />

agregar o quitar elementos <strong>de</strong>s<strong>de</strong> el extremo superior <strong>de</strong> la pila, el que en a<strong>de</strong>lante se <strong>de</strong>nominará<br />

como “tope”.<br />

Definición <strong>de</strong>l Tipo Pila<br />

const int MAX = 1024;<br />

type<strong>de</strong>f struct PILA<br />

{<br />

int elementos[MAX];//representa los elementos<br />

int tope;//indica el tope <strong>de</strong> la pila<br />

};<br />

La anterior es una <strong>de</strong>finición <strong>de</strong>l tipo PILA usando una estructura y un arreglo. El tipo <strong>de</strong>l arreglo<br />

<strong>de</strong>finirá el tipo <strong>de</strong> la pila, en este caso es <strong>de</strong> enteros. Este tipo <strong>de</strong> pilas implementadas con<br />

arreglos, tienen una capacidad máxima (indicada con la constante MAX). Existe otro tipo <strong>de</strong><br />

implementación utilizando punteros pero no será analizado en este curso.<br />

Operaciones <strong>de</strong> la Pila<br />

Las operaciones básicas <strong>de</strong> la pila son:<br />

<br />

<br />

<br />

Mete: introduce un elemento en el tope <strong>de</strong> la pila.<br />

Saca: quita y <strong>de</strong>vuelve el elemento en el tope <strong>de</strong> la pila.<br />

Tope: recupera el elemento <strong>de</strong>l tope <strong>de</strong> la pila sin quitarlo.<br />

Existen otras operaciones que permiten preguntar si la pila está llena o vacía como así también<br />

vaciar la pila. A continuación se pue<strong>de</strong>n ver las funciones “Mete” y “Saca”. El resto <strong>de</strong> las funciones<br />

se encuentran en un archivo <strong>de</strong> código fuente <strong>de</strong>nominado “pila.cpp”.<br />

//mete un elemento en la pila<br />

void Mete(PILA& pila, int elemento)<br />

{<br />

if(pila.tope + 1 == MAX) //esta llena<br />

cout


Introducción a la Programación – Parte 10 – <strong>Tipos</strong> <strong>de</strong> <strong>Datos</strong> <strong>Abstractos</strong><br />

//saca un elemento <strong>de</strong> la pila<br />

int Saca(PILA& pila)<br />

{<br />

int res = -1;<br />

if(pila.tope < 0)<br />

cout


Introducción a la Programación – Parte 10 – <strong>Tipos</strong> <strong>de</strong> <strong>Datos</strong> <strong>Abstractos</strong><br />

que el primer elemento podría estar en la posición 5 por ejemplo, y el último en la posición 3 <strong>de</strong>l<br />

arreglo, esto a causa <strong>de</strong> sucesivas inserciones y supresiones. A continuación se pue<strong>de</strong>n ver las<br />

funciones “EnFila” y “DesFila”. El resto <strong>de</strong> las funciones se encuentran en un archivo <strong>de</strong> código<br />

fuente <strong>de</strong>nominado “fila.cpp”.<br />

//pone en fila un elemento<br />

void EnFila(FILA& fila, int elemento)<br />

{<br />

if(EstaLlena(fila))//esta llena<br />

cout

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!