Vous êtes sur la page 1sur 37

Estructuras dinámicas en C++: Listas tipo Cola

Una lista se comporta como una cola si las inserciones las hacemos al final y
las extracciones las hacemos por el frente de la lista. También se las llama
listas FIFO (First In First Out - primero en entrar primero en salir)
Confeccionaremos un programa que permita administrar una lista tipo cola.
Desarrollaremos los métodos de insertar, extraer, vacia e imprimir, además del
constructor y destructor.

Programa:

#include <iostream>

using namespace std;

class Cola {
private:
class Nodo {
public:
int info;
Nodo *sig;
};

Nodo *raiz;
Nodo *fondo;
public:
Cola();
~Cola();
void insertar(int x);
int extraer();
void imprimir();
bool vacia();
};

Cola::Cola()
{
raiz = NULL;
fondo = NULL;
}

Cola::~Cola()
{
Nodo *reco = raiz;
Nodo *bor;
while (reco != NULL)
{
bor = reco;
reco = reco->sig;
delete bor;
}
}

void Cola::insertar(int x)
{
Nodo *nuevo;
nuevo = new Nodo();
nuevo->info = x;
nuevo->sig = NULL;
if (vacia())
{
raiz = nuevo;
fondo = nuevo;
}
else {
fondo->sig = nuevo;
fondo = nuevo;
}
}

int Cola::extraer()
{
if (!vacia())
{
int informacion = raiz->info;
Nodo *bor = raiz;
if (raiz == fondo)
{
raiz = NULL;
fondo = NULL;
}
else
{
raiz = raiz->sig;
}
delete bor;
return informacion;
}
else
return -1;
}

void Cola::imprimir()
{
Nodo *reco = raiz;
cout << "Listado de todos los elementos de
la cola.\n";
while (reco != NULL)
{
cout << reco->info << "-";
reco = reco->sig;
}
cout << "\n";
}

bool Cola::vacia()
{
if (raiz == NULL)
return true;
else
return false;
}

void main()
{
Cola *cola1 = new Cola();
cola1->insertar(5);
cola1->insertar(10);
cola1->insertar(50);
cola1->imprimir();
cout <<"Extraemos uno de la cola:" <<cola1-
>extraer()<<"\n";
cola1->imprimir();
delete cola1;
cin.get();
}
Este proyecto lo puede descargar en un zip desde este enlace : Cola1.zip
La declaración del nodo es igual a la clase Pila. Luego definimos dos punteros
externos llamados raiz y fondo:
class Cola {
private:
class Nodo {
public:
int info;
Nodo *sig;
};

Nodo *raiz;
Nodo *fondo;
public:
Cola();
~Cola();
void insertar(int x);
int extraer();
void imprimir();
bool vacia();
};

raíz apunta al principio de la lista y fondo al final de la lista. Utilizar dos


punteros tiene como ventaja que cada vez que tengamos que insertar un nodo
al final de la lista no tengamos que recorrerla. Por supuesto que es
perfectamente válido implementar una cola con un único puntero externo a la
lista.
En el constructor inicializamos a los dos punteros en NULL :
Cola::Cola()
{
raiz = NULL;
fondo = NULL;
}
Y en el destructor igual que en la clase Pila procedemos a liberar el espacio
ocupado por cada uno de los nodos de la lista;
Cola::~Cola()
{
Nodo *reco = raiz;
Nodo *bor;
while (reco != NULL)
{
bor = reco;
reco = reco->sig;
delete bor;
}
}
El método vacía retorna true si la lista no tiene nodos y false en caso contrario:
bool Cola::vacia()
{
if (raiz == NULL)
return true;
else
return false;
}
En la inserción luego de crear el nodo tenemos dos posibilidades: que la cola
esté vacía, en cuyo caso los dos punteros externos a la lista deben apuntar al
nodo creado, o que haya nodos en la lista.
void Cola::insertar(int x)
{
Nodo *nuevo;
nuevo = new Nodo();
nuevo->info = x;
nuevo->sig = NULL;
if (vacia())
{
raiz = nuevo;
fondo = nuevo;
}
else
{
fondo->sig = nuevo;
fondo = nuevo;
}
}
Recordemos que definimos un puntero llamado nuevo, luego creamos el nodo
con el operador new y cargamos los dos atributos, el de información con lo que
llega en el parámetro y el puntero con NULL ya que se insertará al final de la
lista, es decir no hay otro después de este.
Si la lista está vacía:

En caso de no estar vacía:

Debemos enlazar el puntero sig del último nodo con el nodo recién creado:
fondo->sig = nuevo;
Y por último el puntero externo fondo debe apuntar al nodo apuntado por
nuevo:
fondo = nuevo;

Con esto ya tenemos correctamente enlazados los nodos en la lista tipo cola.
Recordar que el puntero nuevo desaparece cuando se sale del método insertar,
pero el nodo creado no se pierde porque queda enlazado en la lista.
El funcionamiento del método extraer es similar al de la pila:
int Cola::extraer()
{
if (!vacia())
{
int informacion = raiz->info;
Nodo *bor = raiz;
if (raiz == fondo)
{
raiz = NULL;
fondo = NULL;
}
else
{
raiz = raiz->sig;
}
delete bor;
return informacion;
}
else
return -1;
}
Si la lista no está vacía guardamos en una variable local la información del
primer nodo:
int informacion = raiz->info;
Definimos un puntero y lo inicializamos con el primero de la lista:
Nodo *bor = raiz;
Para saber si hay un solo nodo verificamos si los dos punteros raiz y fondo
apuntan a la misma dirección de memoria:
if (raiz == fondo)
{

Luego hacemos:
raiz = NULL;
fondo = NULL;

En caso de haber 2 o más nodos debemos avanzar el puntero raiz al siguiente


nodo:

raiz = raiz->sig;

Ya tenemos la lista correctamente enlazada (raiz apunta al primer nodo y fondo


continúa apuntando al último nodo)
Finalmente eliminamos el nodo y retornamos la información:
delete bor;
return informacion;
Si la lista tipo cola está vacía retornamos un -1 (que representa que la cola está
vacía, no debemos insertar este valor -1 en la lista)

Estructuras dinámicas en C++: Listas tipo Pila


Una lista se comporta como una pila si las inserciones y extracciones las
hacemos por un mismo lado de la lista. También se las llama listas LIFO (Last
In First Out - último en entrar primero en salir)
Importante: Una pila al ser una lista puede almacenar en el campo de
información cualquier tipo de valor (int, char, float, vector de caracteres, un
objeto, etc.)
Para estudiar el mecanismo de utilización de una pila supondremos que en el
campo de información almacena un entero (para una fácil interpretación y
codificación)
Inicialmente la PILA está vacía y decimos que el puntero raiz apunta a NULL
(Si apunta a NULL decimos que no tiene una dirección de memoria, en realidad
este valor NULL es el valor cero):

Insertamos un valor entero en la pila: insertar(10)

Luego de realizar la inserción la lista tipo pila queda de esta manera: un nodo
con el valor 10 y raiz apunta a dicho nodo. El puntero del nodo apunta a NULL
ya que no hay otro nodo después de este.
Insertamos luego el valor 4: insertar(4)

Ahora el primer nodo de la pila es el que almacena el valor cuatro. raiz apunta
a dicho nodo. Recordemos que raiz es el puntero externo a la lista que
almacena la dirección del primer nodo.
El nodo que acabamos de insertar en el campo puntero guarda la dirección del
nodo que almacena el valor 10.
Ahora qué sucede si extraemos un nodo de la pila. ¿Cuál se extrae? Como
sabemos en una pila se extrae el último en entrar.
Al extraer de la pila tenemos: extraer()
La pila ha quedado con un nodo.
Hay que tener cuidado que si se extrae un nuevo nodo la pila quedará vacía y
no se podrá extraer otros valores (avisar que la pila está vacía)
Problema 1:
Confeccionar una clase que administre una lista tipo pila (se debe poder
insertar, extraer e imprimir los datos de la pila)

Programa:

#include <iostream>

using namespace std;

class Pila {
private:
class Nodo {
public:
int info;
Nodo *sig;
};

Nodo *raiz;
public:
Pila();
~Pila();
void insertar(int x);
int extraer();
void imprimir();
};

Pila::Pila()
{
raiz = NULL;
}

void Pila::insertar(int x)
{
Nodo *nuevo;
nuevo = new Nodo();
nuevo->info = x;
if (raiz == NULL)
{
raiz = nuevo;
nuevo->sig = NULL;
}
else
{
nuevo->sig = raiz;
raiz = nuevo;
}
}

void Pila::imprimir()
{
Nodo *reco = raiz;
cout << "Listado de todos los elementos de
la pila.\n";
while (reco != NULL)
{
cout << reco->info << "-";
reco = reco->sig;
}
cout << "\n";
}

int Pila::extraer()
{
if (raiz != NULL)
{
int informacion = raiz->info;
Nodo *bor = raiz;
raiz = raiz->sig;
delete bor;
return informacion;
}
else
{
return -1;
}
}

Pila::~Pila()
{
Nodo *reco = raiz;
Nodo *bor;
while (reco != NULL)
{
bor = reco;
reco = reco->sig;
delete bor;
}
}

void main()
{
Pila *pila1;
pila1= new Pila();
pila1->insertar(10);
pila1->insertar(40);
pila1->insertar(3);
pila1->imprimir();
cout<<"Extraemos de la pila:" <<pila1-
>extraer()<<"\n";
pila1->imprimir();
cout<<"Retornamos primero de la pila:"
<<pila1->retornar()<<"\n";
pila1->imprimir();
delete pila1;
cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace : Pila1.zip


Analicemos las distintas partes de este programa:
Lo nuevo que vemos en el lenguaje C++ es la posibilidad de declarar clases
dentro de otra clase. Esto hace que podamos encapsular una clase para que
solo tenga acceso la clase que la contiene:
class Pila {
private:
class Nodo {
public:
int info;
Nodo *sig;
};

Nodo *raiz;
public:
Pila();
~Pila();
void insertar(int x);
int extraer();
int retornar();
void imprimir();
};
La clase Nodo es interna a la clase Pila. Como podemos observar hemos
declarado dentro de la clase Nodo dos atributos y los hemos definido de tipo
public (lo hacemos public para accederlos directamente y no por medio de un
método para que el código generado sea más eficiente y para respetar el
encapsulamiento de datos propuesto por la programación orientada a objetos
planteamos una clase interna)
Para declarar un nodo dijimos que utilizamos una clase. En este caso la
información del nodo (info) es un entero y siempre el nodo tendrá una
referencia o puntero de tipo Nodo, que le llamamos sig.
El puntero sig apunta al siguiente nodo o a NULL en caso que no exista otro
nodo. Este puntero es interno a la clase Nodo.
También definimos un puntero de tipo Nodo llamado raiz. Este puntero tiene la
dirección del primer nodo de la lista. En caso de estar vacía la lista, raiz apunta
a NULL (es decir no tiene dirección)
raiz es un puntero externo a la pila y por eso lo definimos fuera de la clase
Nodo pero dentro de la clase Pila.
El puntero raiz es fundamental porque al tener la dirección del primer nodo de
la lista nos permite acceder a los demás nodos.
Pila::Pila()
{
raiz = NULL;
}
En el constructor de la clase hacemos que raiz guarde el valor NULL.
Tengamos en cuenta que si raiz tiene almacenado NULL la lista está vacía, en
caso contrario tiene la dirección del primer nodo de la lista.
void Pila::insertar(int x)
{
Nodo *nuevo;
nuevo = new Nodo();
nuevo->info = x;
if (raiz == NULL)
{
raiz = nuevo;
nuevo->sig = NULL;
}
else
{
nuevo->sig = raiz;
raiz = nuevo;
}
}
Uno de los métodos más importantes que debemos entender en una pila es el
de insertar un elemento en la pila.
Al método llega la información a insertar, en este caso en particular es un valor
entero.
La creación de un nodo requiere dos pasos:
- Definición de un puntero o referencia a un tipo de dato Nodo:
Nodo *nuevo;
- Creación del nodo (creación de un objeto):

nuevo = new Nodo();


Cuando se ejecuta el operador new se reserva espacio para el nodo.
Realmente se crea el nodo cuando se ejecuta el new.

Paso seguido debemos guardar la información del nodo (como el atributo info
es público luego lo accedemos mediante el operador ->):
nuevo->info = x;
En el campo info almacenamos lo que llega en el parámetro x. Por ejemplo si
llega un 5 el nodo queda:

Por último queda enlazar el nodo que acabamos de crear al principio de la lista.
Si la lista está vacía debemos guardar en el atributo sig del nodo el valor NULL
para indicar que no hay otro nodo después de este, y hacer que raiz apunte al
nodo creado (sabemos si una lista esta vacía si raiz almacena un NULL, es
decir el valor que le almacenamos en el constructor)
if (raiz == NULL)
{
nuevo->sig = NULL;
raiz = nuevo;
}

Gráficamente podemos observar que cuando indicamos raiz=nuevo, el puntero


raiz guarda la dirección del nodo apuntado por nuevo.
Tener en cuenta que cuando finaliza la ejecución del método el puntero nuevo
desaparece, pero no el nodo creado con el operador new.
En caso que la lista no esté vacía, el puntero sig del nodo que acabamos de
crear debe apuntar al que es hasta este momento el primer nodo, es decir al
nodo que apunta raiz actualmente.
else
{
nuevo->sig = raiz;
raiz = nuevo;
}
Como primera actividad cargamos en el puntero sig del nodo apuntado por
nuevo la dirección de raiz, y posteriormente raiz apunta al nodo que acabamos
de crear, que será ahora el primero de la lista.
Antes de los enlaces tenemos:

Luego de ejecutar la línea:


nuevo->sig = raiz;
Ahora tenemos:

Por último asignamos a raiz la dirección que almacena el puntero nuevo.


raiz = nuevo;
La lista queda:

El método extraer:
int Pila::extraer()
{
if (raiz != NULL)
{
int informacion = raiz->info;
Nodo *bor = raiz;
raiz = raiz->sig;
delete bor;
return informacion;
}
else
{
return -1;
}
}
El objetivo del método extraer es retornar la información del primer nodo y
además borrarlo de la lista.
Si la lista no está vacía (es decir raiz tiene un valor distinto a NULL) guardamos
en una variable local la información del primer nodo:
int informacion = raiz->info;
Creamos un puntero auxiliar y hacemos que apunte al nodo que vamos a
borrar:
Nodo *bor = raiz;
Avanzamos raiz al segundo nodo de la lista, ya que borraremos el primero (si
no hay otro nodo más adelante en raiz se guarda NULL ya que el último nodo
de la lista tiene en el puntero sig dicho valor):
raiz = raiz->sig;
Procedemos a eliminar el primer nodo de la lista llamando al operador delete:
delete bor;
Retornamos la información:
return informacion;
En caso de estar vacía la pila retornamos el número -1 y lo tomamos como
código de error (es decir nunca debemos guardar el entero -1 en la pila)
else
{
return -1;
}
Es muy importante entender gráficamente el manejo de las listas. La
interpretación gráfica nos permitirá plantear inicialmente las soluciones para el
manejo de listas.

Expliquemos el método para recorrer una lista en forma completa e imprimir la


información de cada nodo:
void Pila::imprimir()
{
Nodo *reco = raiz;
cout << "Listado de todos los elementos de la
pila.\n";
while (reco != NULL)
{
cout << reco->info << "-";
reco = reco->sig;
}
cout << "\n";
}
Definimos un puntero auxiliar reco y hacemos que apunte al primer nodo de la
lista:
Nodo *reco = raiz;
Disponemos una estructura repetitiva que se repetirá mientras reco sea distinto
a NULL. Dentro de la estructura repetitiva hacemos que reco avance al
siguiente nodo:
while (reco != NULL)
{
cout << reco->info << "-";
reco = reco->sig;
}
Es muy importante entender la línea:
reco = reco->sig;
Estamos diciendo que reco almacena la dirección que tiene el puntero sig del
nodo apuntado actualmente por reco.
Gráficamente:

Al analizarse la condición:
while (reco != NULL)
Es verdadero ya que reco apunta a un nodo y se vuelve a ejecutar la línea:
reco = reco->sig;
Ahora reco apunta al siguiente nodo:

La condición del while nuevamente se valúa en verdadera y avanza el puntero


reco al siguiente nodo:
reco = reco->sig;

Ahora sí reco apunta a NULL (tiene almacenado un NULL) y ha llegado el final


de la lista (Recordar que el último nodo de la lista tiene almacenado en el
puntero sig el valor NULL, con el objetivo de saber que es el último nodo)
El último método a analizar es el destructor de la clase que tiene por objetivo
liberar el espacio ocupado por los nodos de la lista, esta actividad es
fundamental:
Pila::~Pila()
{
Nodo *reco = raiz;
Nodo *bor;
while (reco != NULL)
{
bor = reco;
reco = reco->sig;
delete bor;
}
}

Definimos dos punteros auxiliares: reco y bor. A reco lo inicializamos con el


primer nodo de la lista (en forma similar a como hicimos el imprimir donde
recorremos toda la lista):
Nodo *reco = raiz;
Nodo *bor;
Mediante un while recorreremos toda la lista:
while (reco != NULL)
Dentro del while inicializamos el puntero bor con la dirección del nodo que
apunta reco:
bor = reco;
Inmediatamente avanzamos reco al siguiente nodo:
reco = reco->sig;
Y procedemos a borrar el nodo apuntado por bor:
delete bor;
Este while se repite mientras haya nodos en la lista.
Para poder probar esta clase recordemos que debemos definir un objeto de la
misma y llamar a sus métodos:
void main()
{
Pila *pila1;
pila1= new Pila();
pila1->insertar(10);
pila1->insertar(40);
pila1->insertar(3);
pila1->imprimir();
cout<<"Extraemos de la pila:" <<pila1-
>extraer()<<"\n";
pila1->imprimir();
cout<<"Retornamos primero de la pila:" <<pila1-
>retornar()<<"\n";
pila1->imprimir();
delete pila1;
cin.get();
}

Insertamos 3 enteros, luego imprimimos la pila, extraemos uno de la pila y


finalmente imprimimos nuevamente la pila.
Problema 2:
Agregar a la clase Pila un método que retorne la cantidad de nodos y otro que
indique si esta vacía.

Programa:

#include <iostream>

using namespace std;

class Pila {
private:
class Nodo {
public:
int info;
Nodo *sig;
};
Nodo *raiz;
public:
Pila();
~Pila();
void insertar(int x);
int extraer();
void imprimir();
int cantidad();
bool vacia();
};

Pila::Pila()
{
raiz = NULL;
}

void Pila::insertar(int x)
{
Nodo *nuevo;
nuevo = new Nodo();
nuevo->info = x;
if (raiz == NULL)
{
raiz = nuevo;
nuevo->sig = NULL;
}
else
{
nuevo->sig = raiz;
raiz = nuevo;
}
}

void Pila::imprimir()
{
Nodo *reco = raiz;
cout << "Listado de todos los elementos de
la pila.\n";
while (reco != NULL)
{
cout << reco->info << "-";
reco = reco->sig;
}
cout << "\n";
}

int Pila::extraer()
{
if (raiz != NULL)
{
int informacion = raiz->info;
Nodo *bor = raiz;
raiz = raiz->sig;
delete bor;
return informacion;
}
else
{
return -1;
}
}

Pila::~Pila()
{
Nodo *reco = raiz;
Nodo *bor;
while (reco != NULL)
{
bor = reco;
reco = reco->sig;
delete bor;
}
}

int Pila::cantidad()
{
Nodo *reco = raiz;
int cant = 0;
while (reco != NULL)
{
cant++;
reco = reco->sig;
}
return cant;
}

bool Pila::vacia()
{
if (raiz == NULL)
return true;
else
return false;
}

void main()
{
Pila *pila1;
pila1 = new Pila();
pila1->insertar(10);
pila1->insertar(40);
pila1->insertar(3);
pila1->imprimir();
cout << "La cantidad de nodos de la pila
es:" << pila1->cantidad() << "\n";
while (pila1->vacia() == false)
{
cout << "Extraemos de la pila:" <<
pila1->extraer() << "\n";
}
delete pila1;
cin.get();
}
Este proyecto lo puede descargar en un zip desde este enlace : Pila2.zip
Para verificar si la pila esta vacía verificamos el contenido de la variable raiz, si
tiene NULL luego la lista esta vacía y por lo tanto retornamos un true (el tipo de
dato bool en C++ puede almacenar solo alguno de estos dos valores: true o
false):
bool Pila::vacia()
{
if (raiz == NULL)
return true;
else
return false;
}
El algoritmo para saber la cantidad de nodos es similar al imprimir, pero en
lugar de mostrar la información del nodo procedemos a incrementar un
contador:
int Pila::cantidad()
{
Nodo *reco = raiz;
int cant = 0;
while (reco != NULL)
{
cant++;
reco = reco->sig;
}
return cant;
}
Para probar esta clase en la main creamos un objeto de la clase Pila
insertamos tres enteros:
Pila *pila1;
pila1 = new Pila();
pila1->insertar(10);
pila1->insertar(40);
pila1->insertar(3);
Imprimimos la pila (nos muestra los tres datos):
pila1->imprimir();
Llamamos al método cantidad (nos retorna un 3):
cout << "La cantidad de nodos de la pila es:" <<
pila1->cantidad() << "\n";
Luego mientras el método vacía nos retorne un false (lista no vacía)
procedemos a llamar al método extraer:
while (pila1->vacia() == false)
{
cout << "Extraemos de la pila:" << pila1-
>extraer() << "\n";
}
Para entender el concepto de punteros el Visual Studio nos provee una
herramienta de ejecutar línea a línea un programa y poder ver el estado de las
variables.
Para ejecutar paso a paso debemos seleccionar desde el menú de opciones
DEBUG -> Step Into (o más fácil presionar la tecla F11):
Cada vez que presionemos F11 se ejecutará una línea de código de nuestro
programa y podremos ver en una ventana el contenido de las variables
definidas:
Como vemos presionando F11 se ejecuta una línea de código, en el caso que
se llama a un método vemos como la ejecución continua dentro de cada línea
del método y al finalizar vuelve a la main para ingresar al siguiente método y
así sucesivamente.
Cuando se ejecuta el cout podemos ver el código fuente del mismo, en muchos
casos esto no nos sirve y podemos hacer que se ejecute en un solo paso
presionando la tecla F10 (Step Over) en lugar de F11
#include <iostream.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
#define MAX 30
//COLA ESTATICA

class cola
{
private:
char datos [MAX];
int frente;
int final;
public:
int b;
cola ();
char meter (char nuevo);
char sacar (void);
void estado (void);
void consultar (void);
};

void cola::cola()
{
frente=0;
final=0;
cout<<"\n\t\t *******COLA CREADA******";
}
char cola::meter (char nuevo)
{
if (final==MAX-1)
{
cout<<"\n\n\t\t\t Cola LLENa"<<endl;
return 0;
}
else
{
datos [final]=nuevo;
final++;
if (b==0)
cout<<"\n\n\t\t\t***** Dato insertado *****";
return 1;
}
}
char cola::sacar (void)
{
char valor;
if (final==0)
{
cout<<"\n\n\n\t\t Pila Vacia";
return 0;
}
else
{
valor =datos [frente];
frente++;
if (b==0)
cout<<"\n\t\t\t ***** Dato eliminado *****";
return valor;
}
}
void cola::estado (void)
{
if (final==MAX -1)
cout <<"\n\t\t\t COLA LLENA";
if (final== -1)
cout <<"\n\t\t\t COLA VACIA";
else
cout <<"\n\t\t\t COLA PARCIALMENTE OCUPADA";
}
void cola::consultar ()
{
char dat[MAX];
int i=frente;
if (final==0)
cout <<"\n\t\t\t Cola Vacia, no se pueden consultra
datos"<<endl;
else
{
cout<<"\n\n\n\t\t\t Los datos de la Cola son: "<<endl;
cout<<"\n\t\t\t ";
while(i<=final-1)
{
b=1;
dat[i]=sacar();
cout<<" "<<dat[i];
i++;
}
for (i=final-1;i>=0;i--)
{
b=1;
meter(dat[i]);
}
}
}
int main (void)
{
int opc;
char dato,x;
cola col;
clrscr();
do
{
cout <<"\n\n\t\t\******************************************\n";
cout <<"\n\t\t\t COLA ESTATICA"<<endl;
cout <<"\n\n\t\t\******************************************\n";
cout <<"\n\t\t\t 1. Crear Cola"<<endl;
cout <<"\n\t\t\t 2. Estado de la Cola"<<endl;
cout <<"\n\t\t\t 3. Insertar Elemento"<<endl;
cout <<"\n\t\t\t 4. Eliminar elemento"<<endl;
cout <<"\n\t\t\t 5. Consultar"<<endl;
cout <<"\n\t\t\t 6. Finalizar"<<endl;
cin>>opc;
switch (opc)
{
case 1:
cola ();
break;
case 2:
col.estado();
break;
case 3:
cout <<"\n\t\t\t Dame el dato a Insertar"<<endl;
cin>>dato;
col.b=0;
col.meter(dato);
break;
case 4:
col.b=0;
col.sacar();
break;
case 5:
col.consultar();
break;
}
}while (opc !=6);
getch ();
return 0;
}

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
//Pila Dinamica
struct cola
{
int num;
struct cola *sig;
}
*CAB=NULL, *AUX=NULL, *FIN=NULL;
void crear ()
{
AUX=(struct cola *)malloc(sizeof(struct cola));
AUX->sig=NULL;
cout<<"\n\t\t\t ***Cola Creada***";
}
void insertar (void)
{
clrscr ();
cout<<"\n\t\t\t Dame el Numero";
cin>>AUX->num;
if (FIN==NULL)
{
FIN=CAB=AUX;
}
else
{
FIN->sig=AUX;
FIN=AUX;
cout<<"\n\t\t\t ***Dato Insertado***";
}
}
void extraer (void)
{
if (CAB==NULL)
{
cout<<"\n\t\t\t Cola Vacia";
}
else
{
AUX=CAB;
CAB=CAB->sig;
free(AUX);
cout<<"\n\t\t\t Dato Eliminado";
}
}
void estado (void)
{
if (CAB==NULL)
cout<<"\n\t\t\t Cola Vacia";
else
cout<<"\n\t\t\t Cola con Elementos";
}
void consultar ()
{
if (CAB==NULL)
cout<<"\n\t\t\t Cola Vacia, No se pueden consultar
los datos"<<endl;
else
{
clrscr();
AUX=CAB;
cout<<"\n\t\t\t Los datos de la Cola son:
"<<endl;
while (AUX!=NULL)
{
cout<<"\t\t\t "<<AUX->num;
AUX=AUX->sig;

}
}
}
main ()
{
int opc;
clrscr ();
do{
cout<<"\n\t\t******************************\n";
cout<<"\n\t\t COLA DINAMICA"<<endl;
cout<<"\n\t\t******************************\n";
cout<<"\n\t\t 1.Crear Cola"<<endl;
cout<<"\n\t\t 2.Estado de la Cola"<<endl;
cout<<"\n\t\t 3.Insertar Elemento"<<endl;
cout<<"\n\t\t 4.Eliminar Elemento"<<endl;
cout<<"\n\t\t 5.Consultar"<<endl;
cout<<"\n\t\t 6.Finalizar"<<endl;
cin>>opc;
switch (opc){
case 1:
crear ();
break;
case 2:
estado ();
break;
case 3:
insertar ();
break;
case 4:
extraer ();
break;
case 5:
consultar ();
break;
}
}while (opc!=6);
getch ();
return 0;
}
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
//Cola Circula Dinamica
struct cola
{
int num;
struct cola *sig;
}
*CAB=NULL, *AUX=NULL, *FIN=NULL;
void crear ()
{
AUX=(struct cola *)malloc(sizeof(struct cola));
AUX->sig=NULL;
cout<<"\n\t\t\t ***Cola Creada***";
}
void insertar (void)
{
clrscr ();
cout<<"\n\t\t\t Dame el Numero";
cin>>AUX->num;
if (FIN==NULL)
{
FIN=CAB=AUX;
}
else
{
FIN->sig=AUX;
FIN=AUX;
cout<<"\n\t\t\t ***Dato Insertado***";
}
}
void extraer (void)
{
if (CAB==NULL)
{
cout<<"\n\t\t\t Cola Vacia";
}
else
{
AUX=CAB;
CAB=CAB->sig;
free(AUX);
cout<<"\n\t\t\t Dato Eliminado";
}
}
void estado (void)
{
if (CAB==NULL)
cout<<"\n\t\t\t Cola Vacia";
else
cout<<"\n\t\t\t Cola con Elementos";
}
void consultar ()
{
if (CAB==NULL)
cout<<"\n\t\t\t Cola Vacia, No se pueden consultar
los datos"<<endl;
else
{
clrscr();
AUX=CAB;
cout<<"\n\t\t\t Los datos de la Cola son:
"<<endl;
while (AUX!=NULL)
{
cout<<"\t\t\t "<<AUX->num;
AUX=AUX->sig;

}
}
}
main ()
{
int opc;
clrscr ();
do{
cout<<"\n\t\t******************************\n";
cout<<"\n\t\t COLA CIRCULAR DINAMICA"<<endl;
cout<<"\n\t\t******************************\n";
cout<<"\n\t\t 1.Crear Cola"<<endl;
cout<<"\n\t\t 2.Estado de la Cola"<<endl;
cout<<"\n\t\t 3.Insertar Elemento"<<endl;
cout<<"\n\t\t 4.Eliminar Elemento"<<endl;
cout<<"\n\t\t 5.Consultar"<<endl;
cout<<"\n\t\t 6.Finalizar"<<endl;
cin>>opc;
switch (opc){
case 1:
crear ();
break;
case 2:
estado ();
break;
case 3:
insertar ();
break;
case 4:
extraer ();
break;
case 5:
consultar ();
break;
}
}while (opc!=6);
getch ();
return 0;
}
//Programa para el manejo de una PILA estatica
#include<iostream.h>
#include<stdio.h>
enum estados{VACIA, NORMAL, SIN_ESPACIO};

class pila //clase pila estatica


{
int stack[100];
int tope, max;
enum estados edo;
public:
pila(void) {tope=0;}
void tamano(int t) {max=t;}
void push(int dato);
int pop(void);
void visualizar(void);
void ver_estado(void);
void pon_estado(void);
enum estados obten_estado(void) {return edo;}
};

//Definicion de metodos
void pila::push(int dato)
{stack[tope++]=dato;}

int pila::pop(void)
{return(stack[--tope]);}

void pila::visualizar(void)
{
cout<<"DATOS";
for(short i=0;i<tope;i++)
cout<<":"<<stack[i];
cout<<"<--Tope"<<endl;}

void pila::pon_estado(void)
{
edo=NORMAL;
if(tope==max) edo=SIN_ESPACIO;
if(tope==0) edo=VACIA;}

void pila::ver_estado(void){
{
switch(obten_estado())
{
case NORMAL:cout<<"Pila NORMAL \n";break;
case VACIA:cout<<"Pila VACIA \n";break;
case SIN_ESPACIO:cout<<"Pila LLENA \n";break;
}
}

short menu(void)
{
short opc;
cout<<"\n\t*****OPERACIONES CON PILA*****\n";
cout<<"\t\t1. insertar\n";
cout<<"\t\t2. extraer\n";
cout<<"\t\t3. visualizar\n";
cout<<"\t\t4. estado de la pila\n";
cout<<"\t\t0. salir\n";

cout<<"\t\tdigita tu opcion:";
cin>>opc;
cout<<endl;
return opc;
}

//Programa para el manejo de una pila estatica

int main()
{
pila pila1;
int x;
short op, tam;

cout<<"\n\nDa el tama¤o de la pila:";


cin>>tam;
pila1.tamano(tam);
pila1.pon_estado();

do{
op=menu();

switch(op)
{
case 1:if(pila1.obten_estado()!=SIN_ESPACIO)
{
cout<<"Da el elemento a insertar[100]:";
cin>>x;
pila1.push(x);
pila1.pon_estado();
}
else pila1.ver_estado();
break;

case 2:if(pila1.obten_estado()!=VACIA)
{
x=pila1.pop();
cout<<"El dato extraido es: "<<x<<endl,
pila1.pon_estado();
}
else cout<<"NO HAY DATOS \n";
break;

case 3:if(pila1.obten_estado()!=VACIA)
{ pila1.visualizar();
else cout<<"NO HAY DATOS\n";
} break;
case 4: pila1.ver_estado();
}
}while (op!=0);
return 0;
} ; }
//Manejo de Cola estatica
#include<iostream.h>
//clase Cola
class Cola
{
int c[100];
int e,s;
int tamano;
public:
void inicia(void);
void pondato_cola(int i);
int sacadato_cola(void);
void pon_tamano(int t) {tamano=t;
};

//Definicion de metodos
void Cola::inicia(void)
{
e=s;
s=0;
};

void Cola::pondato_cola(int i)
{
if(e==tamano) {
cout<<"La cola esta llena \n";
return ;
}
c[e++]=i;
};

int Cola::sacadato_cola(void)
{
if(e==s) {
cout<<"La cola esta vacia";
return 0;
}
return c[s++];
};

//Caracterizacion de la clase Cola

int main(void)
{
Cola a,b;//objetos de la clase cola
a.inicia();
b.inicia();
a.pon_tamano(5);
b.pon_tamano(8);
a.pondato_cola(10);
b.pondato_cola(20);
a.pondato_cola(100);
b.pondato_cola(200);
cout<<"COLA A:"<<a.sacadato_cola()<<"\n";
cout<<"COLA A:"<<a.sacadato_cola()<<"\n";
cout<<"COLA A:"<<a.sacadato_cola()<<"\n";
cout<<"COLA B:"<<b.sacadato_cola()<<"\n";
cout<<"COLA B:"<<b.sacadato_cola()<<"\n";
return 0;
}

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
//Pila Dinamica
struct pila
{
int num;
struct pila *ant;
}*CAB=NULL, *AUX=NULL;
void crear (){
AUX=(struct pila *)malloc(sizeof(struct pila));
cout<<"\n\t\t\t ***Pila Creada***";
}
void insertar (void){
clrscr ();
cout<<"\n\t\t\t Dame el Numero";
cin>>AUX->num;
if (CAB==NULL)
{
CAB=AUX;
AUX->ant=NULL;
}
else
{
AUX->ant=CAB;
CAB=AUX;
cout<<"\n\t\t\t ***Dato Insertado***";
}
}
void extraer (void)
{
if (CAB==NULL)
{
cout<<"\n\t\t\t Pila Vacia";
}
else
{
AUX=CAB;
CAB=CAB->ant;
free(AUX);
cout<<"\n\t\t\t Dato Eliminado";
}
}
void estado (void)
{
if (CAB==NULL)
cout<<"\n\t\t\t Pila Vacia";
else
cout<<"\n\t\t\t Pila con Elementos";
}
void consultar ()
{
int temp[80], i=0;
if (CAB==NULL)
cout<<"\n\t\t\t Pila Vacia, No se pueden consultar
los datos"<<endl;
else
{
clrscr();
AUX=CAB;
cout<<"\n\t\t\t Los datos de la Pila son:
"<<endl;
while (AUX!=NULL)
{
temp[i]=AUX->num;
cout<<"\t\t\t "<<temp[i];
AUX=AUX->ant;
i++;
}
}
}
main ()
{
int opc;
clrscr ();
do{
cout<<"\n\t\t******************************\n";
cout<<"\n\t\t PILA DINAMICA"<<endl;
cout<<"\n\t\t******************************\n";
cout<<"\n\t\t 1.Crear Pila"<<endl;
cout<<"\n\t\t 2.Estado de la Pila"<<endl;
cout<<"\n\t\t 3.Insertar Elemento"<<endl;
cout<<"\n\t\t 4.Eliminar Elemento"<<endl;
cout<<"\n\t\t 5.Consultar"<<endl;
cout<<"\n\t\t 6.Finalizar"<<endl;
cin>>opc;
switch (opc){
case 1:
crear ();
break;
case 2:
estado ();
break;
case 3:
insertar ();
break;
case 4:
extraer ();
break;
case 5:
consultar ();
break;
}
}while (opc!=6);
getch ();
return 0;
}

#include <iostream.h>
#include <conio.h>
#define MAX 80
class pila
//PILA ESTATICA
{
private:
char datos [MAX];
int tope;
public:
int b;
pila ();
char meter (char nuevo);
char sacar (void);
void estado (void);
void consultar (void);
};

void pila::pila()
{
tope=-1;
cout<<"\n\t\t *******PILA CREADA******";
}
char pila::meter (char nuevo)
{
if (tope==MAX-1)
{
cout<<"\n\n\t\t\t PIla LLENa"<<endl;
return 0;
}
else
{
tope++;
datos [tope]=nuevo;
if (b==0)
cout<<"\n\n\t\t\t***** Dato insertado *****";
return 1;
}
}
char pila::sacar (void)
{
char valor;
if (tope==-1)
{
cout<<"\n\n\n\t\t Pila Vacia";
return 0;
}
else
{
valor =datos [tope];
tope --;
if (b==0)
cout<<"\n\t\t\t ***** Dato eliminado *****";
return valor;
}
}
void pila::estado (void)
{
if (tope==MAX -1)
cout <<"\n\t\t\t PILA LLENA";
if (tope== -1)
cout <<"\n\t\t\t PILA LLENA";
if ((tope>-1)&&(tope<MAX -1))
cout <<"\n\t\t\t PILA PARCIALMENTE OCUPADA";
}
void pila::consultar ()
{
char dat[MAX];
int i;
if (tope==-1)
cout <<"\n\t\t\t Pila Vacia, no se pueden consultra
datos"<<endl;
else
{
cout<<"\n\n\n\t\t\t Los datos de la pila son: "<<endl;
cout<<"\n\t\t\t ";
for (i=0;i<MAX;i++)
{
b=1;
dat[i]=sacar();
cout<<" "<<dat[i];
}
for (i=MAX-1;i>=0;i--)
{
b=1;
meter(dat[i]);
}
}
}
int main (void)
{
int opc;
char dato,x;
pila pili;
clrscr();
do
{
cout <<"\n\n\t\t\******************************************\n";
cout <<"\n\t\t\t PILA ESTATICA"<<endl;
cout <<"\n\n\t\t\******************************************\n";
cout <<"\n\t\t\t 1. Crear Pila"<<endl;
cout <<"\n\t\t\t 2. Estado de la Pila"<<endl;
cout <<"\n\t\t\t 3. Insertar Elemento"<<endl;
cout <<"\n\t\t\t 4. Eliminar elemento"<<endl;
cout <<"\n\t\t\t 5. Consultar"<<endl;
cout <<"\n\t\t\t 6. Finalizar"<<endl;
cin>>opc;
switch (opc)
{
case 1:
pila ();
break;
case 2:
pili.estado();
break;
case 3:
cout <<"\n\t\t\t Dame el dato a Insertar"<<endl;
cin>>dato;
pili.b=0;
pili.meter(dato);
break;
case 4:
pili.b=0;
pili.sacar();
break;
case 5:
pili.consultar();
break;
}
}while (opc !=6);
getch ();
return 0;
}

Vous aimerez peut-être aussi