Libro Estructura de Datos-Python
Libro Estructura de Datos-Python
QUISBERT VILELA
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
ESTRUCTURA DE DATOS
CON LENGUAJE PYTHON
Un Enfoque Práctico
Elaborado por:
ÍNDICE GENERAL
TEMA 2. ARCHIVOS__________________________________________________5
TEMA 4. PILAS____________________________________________________108
TEMA 5. COLAS___________________________________________________164
TEMA 6 RECURSIVIDAD____________________________________________194
“Nunca consideres el estudio como una obligación, sino como una oportunidad
para penetrar en el bello y maravilloso mundo del saber.”
Albert Einstein
1.1 Introducción.
Muchas empresas han optado como una solución práctica, emplear sistemas
computacionales, con la finalidad de que los procesos cada vez sean más
productivos y competitivos, de esta manera prestar mejores servicios a los clientes.
Es en este contexto, las empresas almacenan y procesan la información mediante
sistemas computacionales. Toda esta información que se procesa no se lo realiza
de forma aislada como si fueran datos simples, si no más al contrario estas tienen
que estar organizados y estructurados de manera sistemática de acuerdo a
determinadas reglas. Cuando la información esta bien organizada trae ventajas
como ser: un fácil acceso y manejo eficiente de los datos, por tal razón los datos
deben estar bien organizados con un cierto tipo de estructura de datos.
Esta organización sistemática de los datos mediante las estructuras de datos hace
que los programas sean eficientes, efectivos de tal forma que habrá una eficiencia
integral de todo el algoritmo, es decir, en la ejecución del mismo.
7
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Estructura de datos
Estáticos Dinámicos
Colas Grafos
Multidimensionales
Listas
8
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Son aquellas en las que el tamaño ocupado en memoria se define antes de que el
programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del
programa. Por ejemplo, los Arreglos, Registros y Conjuntos están en este grupo de
estructuras.
Las estructuras de datos dinámicas, son estructuras que cuya dimensión puede
crecer o disminuir durante la ejecución del programa. Por ejemplos: Listas
Enlazadas, Árboles y Grafos.
9
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Un TDA define lo que cada operación debe hacer, más no como la debe hacer. En
un lenguaje de programación como Java un TDA puede ser expresado como una
interface, que es una simple lista de declaraciones de métodos. Un TDA es
materializado por una estructura de datos concreta, en Java, es modelada por una
clase. Una clase define los datos que serán almacenados y las operaciones
soportadas por los objetos que son instancia de la clase.
LeerDatosEstudiante ()
Operaciones
ImprimirDatosEstudiante ()
o métodos ModificarDireccion()
CalcularNotaFinal()
10
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
2.1 Vectores
2.1.1 Definición de vector.
Un vector es una estructura de datos lineal que almacena los datos de un solo tipo,
los vectores también son llamados arreglos unidimensionales, el cual tiene las
siguientes características:
Tamaño n=9
Elemento
V= 4 25 8 68 60 3 45 3 5
0 1 2 3 4 5 6 7 8
Un vector para poder acceder a los datos se basa en el uso de sus índices.
Cada elemento del vector se puede procesar como si fuera una variable
simple.
El valor del índice indica cual es el elemento que se está referenciando, a
través de ellos pueden realizarse las siguientes operaciones:
11
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
class Vectores(object):
vector = [None]
#Constructor que inicializa el vector
def __init__(self):
self.vector=[]
# Renicializa el vector
def reinicia(self):
self.vector=[]
# Llena datos al vector mediante
# Una cadena
def llenar(self,cadena):
subcadena=cadena.split(",")
for i in subcadena:
d=int(i)
self.vector.append(d)
#llena un vector, ingresando datos
# una a una
def llenar(self,n):
for i in range(n):
s=input("Dato:")
d=int(s)
self.V.append(d)
12
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
2.1.3 Ejemplos
Si N=6
V= 4 6 8 9 2 1
0 1 2 3 4 5
Promedio = (4 + 6 + 8 + 9 + 2 + 1) / 6
Promedio = 30 / 6 = 5
Solución.
#Calcula el promedio de un vector
def promedio(self):
s=0
for i in self.V:
s=s+i
p=s/len(self.V)
return p
vec = Vectores()
print("ingrese datos")
n=int(input("Cantidad de datos:"))
vec.llenar(n)
s=vec.mostrar()
print("Mostrando Datos")
print(s)
p=vec.promedio()
print("El promedio es:",p)
13
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Ejemplo:
4 2 4 4 7 7
B= 1 2 3 4 5 6
La salida sera :
Elemento Se repite
4 3
2 1
7 2
Solución.
self.V[i] = -999;
s = s + "\t=\t" + str(cont) + "\n";
return s;
vec = Vectores()
print("ingrese datos")
n=int(input("Cantidad de datos:"))
vec.llenar(n)
s=vec.mostrar()
print("Mostrando Datos")
print(s)
s=vec.cuenta_ocurrencias()
14
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
A= 4 2 4 4 7 7
1 2 3 4 5 6
Eliminando los duplicados queda:
A= 4 2 7
1 2 3
Solución.
#Elimina los elementos repetidos
#de un vector
def elimina_repetidos(self):
D = []
for e in self.V:
if e not in D:
D.append(e)
self.V=D
Ejemplo:
Si n = 6
V= 0 1 1 2 3 5
1 2 3 4 5 6
15
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
Ejemplo: Si N=4
Vector A:
1 4 9 0
Vector B:
20 30 40 50
Vector C:
1 20 4 30 9 40 0 50
Solución
#Teniendo dos vectores A y B de N posiciones
#cada uno, a partir de estos crear
#otro vector C que contenga los elementos
#tanto de A como de B de forma intercalada.
def intercala (self,A,B,C):
for i in range(len(A.V)):
C.V.append(A.V[i])
C.V.append(B.V[i])
V= 4 6 8 9 2 3
0 1 2 3 4 5
El vector debe se ser ordenado
V= 2 3 4 6 8 9
0 1 2 3 4 5
Solución.
# busca un elemento Xpor el metodo
# de la busqueda Binario
def busquedaBinario(self,X):
pos = -1;
li = 0;
ls = len(self.V) - 1
while (li <= ls) :
mitad = (li + ls) // 2
if (X == self.V[mitad]):
pos = mitad
li = ls + 1
elif (X > self.V[mitad]):
li = mitad + 1
else:
ls = mitad - 1
return pos+1
Si N = 6
18
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
V= 4 6 8 9 2 3
0 1 2 3 4 5
El vector ordenado
V= 2 3 4 6 8 9
0 1 2 3 4 5
Solución.
19
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
P1 =
0 1 2
0 1 2 3
La suma sera
0 1 2 3
Solución
Para dar solución al problema de los polinomios se debe considerar los siguiente.
Leer un polinomio
Mostrar un polinomio
Ordenar un polinomio
20
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
22
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
P2(x)=5X3 + 5X4
0 1 2
P2(x)=5X3 + 5X4
5X3 5X4
P1 =
0 1
0 1 2 3 4 5
0 1 2 3 4 5
23
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
#programa principal
pol1 = Polinomio()
pol2 = Polinomio()
pol3 = Polinomio()
print("Polinomio 1")
pol1.llenarDatos(5)
pol1.ordena()
pol1.simplifica()
s=pol1.mostrarDatos()
print(s)
print("Polinomio 2")
pol2.llenarDatos(5)
pol2.ordena()
pol2.simplifica()
s=pol2.mostrarDatos()
print(s)
print("Polinomio 3")
pol3.multiplica(pol1,pol2,pol3)
s=pol1.mostrarDatos()
print(s)
s=pol2.mostrarDatos()
print(s)
s=pol3.mostrarDatos()
print(s)
24
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
Para resolver el problema primero se debe definir el TDA, el cual se muestra en la
siguiente figura 3.3
class Empleado(object):
emp=[]
#Constructor para inicializar los
#atributos de los empleados
def __init__(self):
self.emp=[]
#Adciona los datos de un empleado
def adicionar(self):
d=[]
n=int(input("cantidad de empleados"))
for i in range(n):
d=[]
idemp=input("C.I.:")
nom=input("Nombre:")
pat=input("Paterno:")
mat=input("Materno:")
dire=input("Direccion:")
sal=input("Salario:")
d.append(idemp)
d.append(nom)
d.append(pat)
d.append(mat)
d.append(dire)
d.append(sal)
self.emp.append(d)
25
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
self.emp=datoa
#Modifica los datos de un empleados
def modificar(self):
cod = input("codigo a modificar")
for d in self.emp:
if d[0]==cod:
print ("ingreso de nuevos datos")
idemp=input("C.I.:")
nom=input("Nombre:")
pat=input("Paterno:")
mat=input("Materno:")
dire=input("Direccion:")
sal=input("Salario:")
d[1]=nom
d[2]=pat
d[3]=mat
d[4]=dire
d[5]=sal
break
#Busca datos de un empleado por el apellido paterno
def buscar(self):
s=""
pat = input("Paterno a buscar:")
for d in self.emp:
if d[1]==pat:
for i in d:
s=s+i+"\t"
s=s+"\n"
return s
#Ordena los datos de un empleado por el paterno
def ordenarPaterno(self):
dat_emp = sorted(self.emp, key=lambda x: x[3])
self.emp=dat_emp
26
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
s="CI\tPaterno\tMaterno\tNombre\tDireccion\tSalario\tAFP\t\tIVA\t\
tTOTAL DESCUENTO\t\tLIQUIDO PAGABLE \n"
s=s+"_____________________________________________________________
_________________________________________________\n"
for i in self.emp:
salario = float(i[5])
afp = salario * 0.1271;
if (salario > 8000):
iva = (salario - 8000) * 0.13;
else:
iva = 0;
descuento = afp + iva;
liquido_pagable = salario - descuento;
s=s+i[0] + "\t" + i[1] + "\t" + i[2] + "\t" + i[3] +
"\t" + i[4] + "\t" + i[5] + "\t" + str(afp) + "\t\t" + str(iva) +
"\t\t" +str(descuento) + "\t\t" + str(liquido_pagable) + "\n"
return s
while True:
print("\nMenu")
print("1. Crear")
print("2. Adicionar")
print("3. Modificar")
print("4. Eliminar")
print("5. Listar ")
print("6. Buscar ")
print("7. Ordenar ")
print("8. Planilla ")
print("* Salir")
opcion=input("Elija Opcion:")
if opcion=="1":
empleado = Empleado()
elif opcion=="2":
empleado.adicionar()
elif opcion=="3":
e=empleado.modificar()
27
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
s="CI\tPaterno\tMaterno\tNombre\tDireccion\tSalario\tAFP\t\tIVA\t\
tTOTAL DESCUENTO\t\tLIQUIDO PAGABLE \n"
s=s+"_____________________________________________________________
_________________________________________________\n"
for i in self.emp:
salario = float(i[5])
afp = salario * 0.1271;
if (salario > 8000):
iva = (salario - 8000) * 0.13;
else:
iva = 0;
descuento = afp + iva;
liquido_pagable = salario - descuento;
s=s+i[0] + "\t" + i[1] + "\t" + i[2] + "\t" + i[3] +
"\t" + i[4] + "\t" + i[5] + "\t" + str(afp) + "\t\t" + str(iva) +
"\t\t" +str(descuento) + "\t\t" + str(liquido_pagable) + "\n"
return s
while True:
print("\nMenu")
print("1. Crear")
print("2. Adicionar")
print("3. Modificar")
print("4. Eliminar")
print("5. Listar ")
print("6. Buscar ")
print("7. Ordenar ")
print("8. Planilla ")
print("* Salir")
opcion=input("Elija Opcion:")
if opcion=="1":
empleado = Empleado()
elif opcion=="2":
empleado.adicionar()
elif opcion=="3":
e=empleado.modificar()
28
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="4":
empleado.eliminar()
elif opcion=="5":
s=empleado.mostrar()
print(s)
elif opcion=="6":
empleado.buscar()
elif opcion=="7":
empleado.ordenarPaterno()
elif opcion=="8":
s=empleado.calculaPlanilla()
print(s)
elif opcion=="9":
s=empleado.salarioMenor()
print(s)
elif opcion=="*":
break
else:
print("opcion no valida")
#Llamada al programa principal
menuPrin()
29
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
3.1 Definición
Una pila representa una estructura de dato lineal, en la que se puede agregar o
quitar elementos específicos por uno de los dos extremos. En consecuencia, los
elementos de una pila se eliminan en orden inverso al que se insertaron; es decir,
el último elemento que se mete en la pila es el primero que se saca. Debido a esta
característica, se le conoce como estructura LIFO (Last input, first output) que
significa (ultimos en entrar, primeros en salir) (Cairo & Guardati, 2006)
Una pila tiene la siguiente representación gráfica como se muestra en la figura 4.1
Max 20
.
.
Tope 6
5 23
4 231
3 23
2 2
1 3
0 12
Pila
Figura 4.1 Representación de una Pila
30
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Nombre Pila
Int Max=20
Atributos int P[Max]
int tope
Crear()
Operaciones boolean Vacio()
boolean Lleno()
adiciona(int e)
Int eliminar()
String mostrar()
void restaurar()
Pila copiar()
31
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
import random
class Pilas (object):
#variables globales
P=[]
tope=0
#constructor, que inicializa los atributos
# iniciliaza objetos
# self (python) = this (java)
def __init__(self):
self.P=[]
self.tope=0
#verificamos si la pila esta vacio
def vacio(self):
if self.tope==0:
return True
else:
return False
#adiciona un elemento a la pila
def adiciona(self,e):
self.P.append(e)
self.tope=self.tope+1
#elimina un elemento de la pila
def elimina(self):
e=-1
if not(self.vacio()):
self.tope=self.tope-1
e=self.P.pop()
else:
print("pila vacia")
return e
# restaura datos
def restaura(self,PA):
while(not(PA.vacio())):
e=PA.elimina()
self.adiciona(e)
#lista datos de la pila
def listar(self):
s=""
PA=Pilas()
while(not self.vacio()):
e=self.elimina()
s= s+ " "+ str(e)
PA.adiciona(e)
self.restaura(PA)
return s
# En una Pila P llenar n datos
# de forma aleatoria en la pila
def adicionaAleatorio(self):
n=int(input("Cantidad de datos a generar:"))
for i in range(1,n+1):
e=random.randint(1,20)
self.adiciona(e)
32
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
Tope 8
7 55
6 4
5 456
4 1234
3 567
2 23
1 457
0 4
P1
Dígitos de longitud 3 son los siguientes números: 456 , 567, 457.
Solución.
Primero se implementará un módulo para contar los dígitos de un número N, la
implementación se muestra a continuación.
#cuenta cantidad de digitos
def cuentaDigitos(self,n):
cont = 0;
while (n != 0):
n = n // 10;
cont=cont+1
return cont;
Una vez implementado el método cuentaDigitos , ahora se implementará el
método cuenta3Digitos, que se muestra a continuación.
# Dada una pila contar elementos de longitud 3
def cuenta3Digitos(self):
cd = 0
e = 0
PA = Pilas()
while (not self.vacio()):
e = self.elimina()
PA.adiciona(e)
if (self.cuentaDigitos(e) == 3):
cd=cd+1
print("Total Digitos de Longitud 3=",cd)
self.restaura(PA)
33
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
8 Tope 8
7 7 6
6 6 1
5 5 19
Tope 4 4 1
3 6 3 6
2 8 2 8
1 4 1 1
0 1 0 9
P1 P2
8 8
7 7
6 6
5 5
Tope 4 Tope 4
3 1 3 3
2 4 2 0
1 8 1 1
0 6 0 2
PT1 PT2
34
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
Tope 8 8
7 4 X 7
6 8 X 6
5 21 5
4 12 X 4
3 6 X 3
2 8 X Tope 2
1 4 X 1 21
0 1 0 1
P1 P1
Solución.
4. Dada una Pila P Buscar un Elemento X en la pila
Tope 8
7 4
6 8
5 2
35
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
41
36
28
14
01
P
Elemento X=2 entonces existe
Solución.
Tope 8 8
7 4 X 7
6 8 6
5 4 X 5
4 1 X Tope 4
3 6 3 8
2 1 X 2 6
1 4 1 4
0 1 0 1
P P
Solución.
#elimina Todos los elemenos x
def eliminaTodoX(self,x):
PA=Pilas()
while not self.vacio():
e=self.elimina()
if x!=e:
PA.adiciona(e)
self.restaura(PA)
# Dada una Pila P, eliminar los elementos repetidos
def eliminaRepetido(self):
PA=Pilas()
while not self.vacio():
e=self.elimina()
self.eliminaTodoX(e) 36
PA.adiciona(e)
self.restaura(PA)
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
6. Dada dos Pilas P1, P2 realizar la unión de elementos en una tercera pila
P3
8 8 8
7 7 Tope 7
6 6 6 7
Tope 5 5 5 10
4 5 Tope 4 4 1
3 9 3 2 3 3
2 2 2 10 2 2
1 3 1 7 1 9
0 1 0 5 0 5
P1 P2 P3
Solución.
# Dada una Pila P, eliminar los elementos repetidos
def eliminaRepetido(self):
PA=Pilas()
while not self.vacio():
e=self.elimina()
self.eliminaTodoX(e)
PA.adiciona(e)
self.restaura(PA)
A.restaura(paux)
Llamadawhile (not B.vacio()):
al programa desde el Botón del Menú Principal
e1 = B.elimina()
paux.adiciona(e1)
if (C.buscar(C, e1) == False):
C.adiciona(e1)
B.restaura(paux)
37
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
8 8 8
7 7 7
6 6 6
Tope 5 5 5
4 5 Tope 4 4
3 9 3 2 3
2 2 2 10 Tope 2
1 3 1 7 1 5
0 1 0 5 0 5
P1 P2 P3
Solución.
8. Dada dos pilas P1, P2 sumar las pilas, ambas pilas tienen la misma
cantidad de elementos.
8 8 8
7 7 7
6 6 6
Tope 5 Tope 5 Tope 5
4 5 4 2 4 7
3 9 3 2 3 9
38
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
2 2 2 10 2 12
1 3 1 7 1 10
0 1 0 5 0 6
P1 P2 P3
Solución.
8
7
6
Tope 5
4 5
3 9
2 2
1 3
0 1
P1
Elemento mayor = 9
#Busca elemento mayor en una pIla
def elemento_mayor(self,A):
paux=Pilas()
mayor = A.elimina()
paux.adiciona(mayor)
while (not A.vacio()):
e2 = A.elimina()
paux.adiciona(e2)
if (mayor < e2):
mayor = e2 39
A.restaura(paux)
return mayor
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
10. Dada una pila A intercambiar el primer elemento de la pila con ultimo
elemento.
Tope 8 Tope 8
7 4 7 1
6 8 6 8
5 4 5 4
4 1 4 1
3 6 3 6
2 1 2 1
1 4 1 4
0 1 0 4
P P
Tope 8 8
7 4 Tope 7
6 8 6 4
5 4 5 8
4 1 4 4
3 6 X 3 1
2 1 2 1
1 4 1 4
40
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
01 0 1
A A
Elemento a eliminar X=6
Solución.
# Elimina Un elemenro X de una Pila
def elimina_elemento(self,x):
paux = Pilas()
while (not self.vacio()):
e1 = self.elimina();
if (e1 != x):
paux.adiciona(e1)
else:
break
self.restaura(paux)
12. Dada una Pila A ordenar sus elementos de la pila A
Tope 8 Tope 8
7 5 7 10
6 8 6 9
5 4 5 8
4 2 4 5
3 3 X 3 4
2 10 2 3
1 9 1 2
0 1 0 1
A A
Solución.
Tope 8
Tope 7 7 10
6 10 6 9
5 9 5 8
4 8 4 7
3 5 3 5
2 4 2 4
1 3 1 3
0 2 0 2
A A
Solución.
#insertar un elemento X en el lugar que le corresponde
def insertar_elemento(self,ex):
paux = Pilas()
sw = False
while (not self.vacio() and (sw == False)):
e1 = self.elimina()
if (e1 < ex):
paux.adiciona(ex)
paux.adiciona(e1)
sw = True
else:
paux.adiciona(e1)
#inserta en caso de que el elemento
#no esta por el medio
if (sw == False):
paux.adiciona(ex)
self.restaura(paux);
42
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
14. Dada una pila A con elementos, contar cuantos elementos se repiten por
cada elemento y almacenar la frecuencia de repeticiones en otras dos
pilas.
Tope 8 8 8
7 8 7 7
6 7 6 6
5 4 Tope 5 Tope 5
4 3 4 1 4 2
3 4 3 3 3 2
2 1 2 4 2 2
1 3 1 7 1 1
0 1 0 8 0 1
P1 p_rep1 p_rep2
Solución.
8
Tope 7
6
5 7
4 6
3 5
2 3
Exponente 1 3
Coeficiente 0 2
P1
Solución.
16. Dado dos Polinomios Pol1, Pol2 realizar la suma de los polinomios
44
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
8 8 Tope 8
7 7 7 8
Tope 6 Tope 6 6 6
5 7 5 8 5 7
4 6 4 6 4 9
3 5 3 7 3 5
2 3 2 3 2 3
1 3 1 3 1 3
0 2 0 4 0 6
Pol1 Pol2 Pol3
Solución .
8 8 Tope 8
7 7 7 3
6 6 6 8
5 5 5 4
Tope 4 Tope 4 4 12
3 2 3 3 3 4
2 3 2 2 2 4
1 1 1 2 1 5
0 2 0 4 0 6
Pol1 Pol2 Pol3
Solución.
def multiplica_polinomio(self,pol1,pol2,pol3):
paux1 = Pilas()
paux2 = Pilas()
while (not pol1.vacio()):
expo1 = pol1.elimina()
coef1 = pol1.elimina()
paux1.adiciona(expo1)
paux1.adiciona(coef1)
while (not pol2.vacio()):
expo2 = pol2.elimina()
coef2 = pol2.elimina() 46
pol3.adiciona(coef1 * coef2)
pol3.adiciona(expo1 + expo2)
paux2.adiciona(expo2)
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
47
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="2":
e=int(input("Ingrese dato"))
pil.adiciona(e)
elif opcion=="3":
pil.adicionaAleatorio()
elif opcion=="4":
pil2.adicionaAleatorio()
elif opcion=="5":
e=pil.elimina()
elif opcion=="6":
s=pil.listar()
print("datos Pila 1",s)
48
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="7":
pil.cuenta3Digitos()
elif opcion=="8":
pil.cuentaRep()
elif opcion=="9":
pil.eliminaPares()
elif opcion=="10":
pil.eliminaRepetido()
elif opcion=="11":
pil3=Pilas()
pil.union(pil,pil2,pil3)
s=pil.listar()
print("pila 1=",s)
s=pil2.listar()
print("pila 2=",s)
s=pil3.listar()
print("pila 3=",s)
elif opcion=="12":
pil3=Pilas()
pil.intersecta(pil,pil2,pil3)
s=pil.listar()
print("pila 1=",s)
s=pil2.listar()
print("pila 2=",s)
s=pil3.listar()
print("pila 3=",s)
elif opcion=="13":
pil3=Pilas()
pil.suma_pilas(pil,pil2,pil3)
s=pil.listar()
print("pila 1=",s)
s=pil2.listar()
print("pila 2=",s)
s=pil3.listar()
print("pila 3=",s)
elif opcion=="14":
m=pil.elemento_mayor(pil)
print("Elemento Mayor:",m)
elif opcion=="15":
pil.intercambia_ultimo_primero()
elif opcion=="16":
x=int(input("Dato a eliminar:"))
pil.elimina_elemento(x)
elif opcion=="17":
pil.ordena_pila(pil)
elif opcion=="18":
x=int(input("Dato a insrtar:"))
pil.insertar_elemento(x)
elif opcion=="19":
x=int(input("Punto a Evaluar:"))
ev=pil.evalua_polinomio(pil,x)
print("La evaluacion es:",ev)
49
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="20":
pil3=Pilas()
pil.suma_polinomio(pil,pil2,pil3)
s=pil.listar()
print("pila 1=",s)
s=pil2.listar()
print("pila 2=",s)
s=pil3.listar()
print("pila 3=",s)
elif opcion=="21":
pil3=Pilas()
pil.multiplica_polinomio(pil,pil2,pil3)
s=pil.listar()
print("pila 1=",s)
s=pil2.listar()
print("pila 2=",s)
s=pil3.listar()
print("pila 3=",s)
elif opcion=="*":
break
else:
print("opcion no valida")
menuPrin()
50
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
51
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
return e
# restaura datos
def restaura(self,PA):
while(not(PA.vacio())):
e=PA.elimina()
self.adiciona(e)
#lista datos de la pila
def listar(self):
s=""
PA=Pilas()
while(not self.vacio()):
e=self.elimina()
s= s+ " "+ str(e)
PA.adiciona(e)
self.restaura(PA)
return s
52
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
#Verifica si es palindrome
def palindrome(self):
sw = False
B = Pilas()
pa = Pilas()
palabra = input("Ingrese palabra a verificar: ")
for e in palabra:
self.adiciona(e)
B = self.copia(self)
while not self.vacio():
pa.adiciona(self.elimina())
con=0
while not B.vacio():
e = B.elimina()
e1 = pa.elimina()
self.adiciona(e1)
if e == e1:
con=con+1
cuenta=self.cuentaElementos()
if cuenta==con:
sw=True
self.restaura(pa)
return sw
Almacenar los datos de un libro (código, titulo, autor, editorial, isbn, año de
edición, cantidad de ejemplares, costo del libro), las operaciones a
implementar son las siguientes:
53
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución
54
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
def get_titulo(self):
return self.titulo
def get_autor(self):
return self.autor
def get_editorial(self):
return self.editorial
def get_isbn(self):
return self.isbn
def get_a_edicion(self):
return self.a_edicion
def get_cantidad_ejem(self):
return self.cantidad_ejem
def get_costo(self):
return self.costo
# Setters
def set_codigo(self, codigo):
self.codigo = codigo
55
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
56
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
57
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para integrar todo los métodos que se ha desarrollado, se diseñara un menu con
el nombre de MenuPrin, en donde se implemetara todo las acciones que sean
necesarias.
from Libros import Biblioteca
from Libros import Libro
def menuPrin():
lib = Biblioteca()
while True:
print("\nMenu Libros")
print("1. Crear")
print("2. Adicionar")
print("3. Eiminar")
print("4. Eiminar por año")
print("5. Listar")
print("6. Buscar por autor")
print("7. Buscar por titulo por iniciales")
print("* Salir")
opcion=input("Elija Opcion:")
if opcion=="1":
lib=Biblioteca()
elif opcion=="2":
print("Ingrese Datos del Libro.")
cod=input("Codigo:")
titulo=input("Titulo:")
autor=input("Autor:")
edit=input("Editorial:")
isbn=input("ISBN:")
aed=input("Año de Edicion:")
cant_ejem=input("Nro. de Ejemplares:")
costo=input("Precio:")
libro =
Libro(cod,titulo,autor,edit,isbn,aed,cant_ejem,costo)
lib.adiciona(libro)
elif opcion=="3":
le=lib.elimina()
elif opcion=="3":
an=input("Ingrese año del libro a eliminar:")
le=lib.elimina_an(an)
elif opcion=="5":
s=lib.listar()
print(s)
elif opcion=="6":
aut=input("Ingrese Autor a buscar")
s=lib.listar_autor(aut)
print("LIBROS ENCONTRADOS POR AUTOR")
print(s)
58
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="7":
tit = input("Iniciales del Titulode libro a Buscar")
s=lib.listar_titulo(tit)
print("LIBROS ENCONTRADOS POR TITULO")
print(s)
elif opcion=="*":
break
else:
print("opcion no valida")
menuPrin()
9 9 9
8 8 8
7 7 7
Tope 6 6 6
PM = 5 5 5 ….. …… 5
4 7 Tope 4 4
3 9 3 6 Tope 3
2 2 2 5 2 3
1 3 1 4 1 1
0 1 0 7 0 6
P1 P2 PN
0 1 …. …. N
59
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
class PilasMultiples(object):
# Lista de listas para almacenar las pilas
def __init__(self, n):
self.n = n
self.PM = [[] for _ in range(n)]
# Verifica si la pila np está vacía
def vacio(self, np):
return len(self.PM[np]) == 0
# Añade un elemento a la pila np
def adiciona(self, np, e):
self.PM[np].append(e)
# Elimina y devuelve el elemento superior de la pila np
def elimina(self, np):
if not self.vacio(np):
e=self.PM[np].pop()
return e
#Lista datos de la n- esima pila
def listar_pila(self, np):
return self.PM[np]
#Listar todas las pilas
def lista_todo(self):
print("Mostrando todas las pilas")
print(self.PM)
60
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Una vez implementado la clase Pilas_multiples con las operaciones básicas, para
integrar estas operaciones, se desarrolla el siguiente programa.
# Menu Principal
def menuPrin():
while True:
print("\nMenu")
print("1. Crear")
print("2. Adicionar")
print("3. Eiminar")
print("4. Listar pila i")
print("5. Listar todas las pilas")
print("* Salir")
opcion=input("Elija Opcion:")
if opcion=="1":
np = int(input("Cuantas pilas se creara:"))
pilm=PilasMultiples(np)
pilm2=PilasMultiples(np)
pilm3=PilasMultiples(np)
elif opcion=="2":
e=int(input("Ingrese dato:"))
np=int(input("En que pila se inserta:"))
pilm.adiciona(np,e)
elif opcion=="3":
np=int(input("Numero de pila:"))
e=pilm.elimina(np)
elif opcion=="4":
np=int(input("Numero de pila a listar:"))
s=pilm.listar_pila(np)
print("datos Pila: ",np,"Datos:",s)
elif opcion=="5":
s=pilm.lista_todo()
elif opcion=="*":
break
else:
print("opcion no valida")
menuPrin()
61
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
2. Dada una Multipila , eliminar los pares de la pila 1 y llevar a la pila 2, los
primos al pila 3 y en la pila 4 debe estar el resto de los elementos.
5
4
#funcion que verifica si un numero es primo o no
2
def verifica_primo(self,n): 5
cont = 0 3 4 2
op = 0 1 2 3 1
sw = False P1 P2 P3 P4 P5
Solución.for i in range (1,n+1):
op = n % i;
if (op == 0):
cont=cont+1;
if (cont == 2):
sw = True
return sw
62
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
print("* Salir")
opcion=input("Elija Opcion:")
if opcion=="1":
np = int(input("Cuantas pilas se creara:"))
pilm=PilasMultiples(np)
pilm2=PilasMultiples(np)
pilm3=PilasMultiples(np)
elif opcion=="2":
e=int(input("Ingrese dato:"))
np=int(input("En que pila se inserta:"))
pilm.adiciona(np,e)
elif opcion=="3":
np=int(input("Numero de pila"))
pilm.llena_datos(np)
elif opcion=="4":
np=int(input("Numero de pila:"))
e=pilm.elimina(np)
elif opcion=="5":
np=int(input("Numero de pila a listar:"))
s=pilm.listar_pila(np)
print("datos Pila: ",np,"Datos:",s)
elif opcion=="6":
s=pilm.lista_todo()
elif opcion=="7":
s=pilm.eliminar_pares_primos()
elif opcion=="*":
break
else:
print("opcion no valida")
menuPrin()
63
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
5.1. Definición
Una cola constituye una estructura de dato lineal en la que los nuevos elementos
se introducen por un extremo y los ya existentes se eliminan por el otro extremo.Es
importante señalar que los componentes de la cola se eliminan en mismo orden en
el cual se insertaron. Es decir el primer elemento que se introduce en la estructura
será el que se eliminará en primer lugar. Debido a esta característica las colas
también reciben el nombre de estructuras FIFO ( First-Input First-Output: que
significa primero en entrar ,primero en salir) (Cairo&Guardati, 2006)
Principio Final
Cola 3 5 7 6 ….
0 1 2 3 4 … 17 18 19
Para crear la estructura Cola debe existir el tamaño máximo de la cola, en este
caso denotaremos con la variable MAX, el cual toma un valor determinado
(MAX=20).
64
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Nombre Cola
int Max=20
Atributos int C[Max]
int fin, principio
int fin_aux
Void Crear()
Operaciones Boolean Vacio()
Boolean Lleno()
Void Adicionar(int e)
Int Eliminar()
String Mostrar()
Void Restaurar()
Cola Copiar()
Int Contar_elementos()
Para operar las colas se deben realizar operaciones básicas que se detalla a
continuación.
Crear () Crea una pila o inicializa el tope de la pila en cero.
Vacío() Verifica si una pila está vacío o no
Lleno() Verifica si una pila está lleno
Adiciona() Adiciona un elemento a la cola
Elimina() Elimina un elemento de la cola
Mostrar() Nuestra los elementos de la cola
Restaura() Restaura elementos de la cola en otra cola
Copia() Copia una cola a otra cola.
Contar_elementos() Cuenta la cantidad de elementos de la cola
65
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
def ___init__(self):
self.C=[]
# restaura datos
def restaura(self,CA):
while(not(CA.vacio())):
e=CA.elimina()
self.adiciona(e)
66
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Principio Final
Cola 3 5 9 8 5 10 14
0 1 3 2 3 4 5
X X X
Principio Final
Cola 3 5 9 5
0 1 2 3 4 5
67
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución
#Metodo para eliminar de una cola los elementos Pares
def elimina_pares(self):
col_aux = Colas()
while(not self.vacio()):
e=self.elimina()
if(e%2!=0):
col_aux.adiciona(e)
self.restaura(col_aux)
Principio Final
Cola 1 2 3 4
0 1 2 3 4 5
Principio Final
Cola 2 3 4 1
0 1 2 3 4 5
Principio Final
Cola 3 4 1 2
0 1 2 3 4 5
Principio Final
Cola 4 1 2 3
0 1 2 3 4 5
Solución.
68
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
def menuPrin():
col=Colas()
while True:
print("\nMenu Colas")
print("1. Crear")
print("2. Adicionar")
print("3. Genera Aleatorio cola ")
print("4. Eiminar")
print("5. Listar Cola 1")
print("6. Eliminar pares ")
print("7. Rotar ")
print("8. Contar elementos ")
print("* Salir")
opcion=input("Elija Opcion:")
if opcion=="1":
col=Colas()
elif opcion=="2":
e=int(input("Ingrese dato"))
col.adiciona(e)
elif opcion=="3":
col.adicionaAleatorio()
elif opcion=="4":
e=col.elimina()
elif opcion=="5":
s=col.listar()
print("datos Cola :",s)
elif opcion=="6":
col.elimina_pares()
s=col.listar()
s=print("cola:",s)
69
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="7":
n=int(input("Cantidad de rotaciones:"))
col.rotar(n)
elif opcion=="8":
cont=col.cuenta_elementos()
print("cuenta:",cont)
elif opcion=="*":
break
else:
print("opcion no valida")
menuPrin()
5.7.1 Definición.
Una cola circular (queue en inglés) es una estructura de datos que almacena datos
y acceso a los datos es bajo la filosofía FIFO (del inglés First Input First Ouput
(PEPS) primero en entrar, primero en salir) que permite almacenar y recuperar
datos, en concreto, disponemos de un vector de estructuras donde almacenar los
datos. Sea m el número de estructuras. La cola circular no puede almacenar más
de N elementos y los datos los numeramos como siempre, por índices que varían
entre 0 y N-1 tal como se muestra en la figura 5.2
70
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Principio Final
0 1 2 3 4 5 … N-1
10 20 30 40 50
Figura 5.2 representacion de la cola circular
Para crear la estructura Cola Circular debe existir el tamaño máximo de la cola, en
este caso denotaremos con la variable MAX, el cual toma un valor determinado
(MAX=20).
Nombre Cola_circular
int Max=20
Atributos int C[Max]
int principio, fin
int fin_aux
+void Crear()
Operaciones +boolean Vacio()
+boolean Lleno()
+void Adicionar(int e)
+int Eliminar()
+String Mostrar()
71
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
+void Restaurar()
+void Copiar()
Para operar las colas circulares se deben realizar operaciones básicas que se
detalla a continuación.
import random
from PilasE import Pilas
class ColaCircular:
#Cosntructor para crear la cola circular
def __init__(self, n):
self.MAX = n
self.C = [None] * n
self.prin = 0
self.fin = 0
#verifica si una cola esta vacia
def vacio(self):
if self.prin == self.fin:
return True
else:
return False;
#verifica si una cola esta llena
def lleno(self):
if ((self.fin+1)% self.MAX == self.prin):
return True
else:
return False
72
#Adiciona un elemento en la cola
def adicionar(self, e):
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Emenor = 5
Final
73
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
def buscaMenor(self,CC):
emenor = 0
e = 0
aux = 0
if (not CC.vacio()):
aux = CC.fin
emenor = CC.eliminar()
CC.adicionar(emenor)
while (CC.prin != aux):
e = CC.eliminar()
CC.adicionar(e)
if (emenor > e):
emenor = e;
return emenor
Fin
Fin
Principio
Solución.
74
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Fin
Principio
Fin
Solución.
#busca un elemento menor en luga lista circular
#sin utilizar cola auxiliar
def buscaMenor(self,CC):
emenor = 0
e = 0
aux = 0
if (not CC.vacio()):
aux = CC.fin
emenor = CC.eliminar()
CC.adicionar(emenor)
while (CC.prin != aux):
e = CC.eliminar()
CC.adicionar(e)
if (emenor > e):
emenor = e;
return emenor
#elimina un elemento X la Primera ocurrencia
#de la cola Circular
def elimina1X(self,CC,x):
CCA = ColaCircular(self.MAX)
if (not CC.vacio()):
aux = CC.fin
while (CC.prin != aux):
e1 = CC.eliminar()
if (e1 != x):
CCA.adicionar(e1)
else:
break
while (not CCA.vacio()):
e=CCA.eliminar()
CC.adicionar(e)
Principio Fin
Fin Principio
Solución.
#elimina un elemento X de la cola Circular
def eliminaX(self,CC,x):
if (not CC.vacio()):
aux = CC.fin
while (CC.prin != aux):
e1 = CC.eliminar()
if (e1 != x):
CC.adicionar(e1)
#elimina elementos repetidos
def elimina_repetidos(self,CC):
s=""
CCA = ColaCircular(self.MAX)
while (not CC.vacio()):
e = CC.eliminar()
CC.eliminaX(CC, e)
CCA.adicionar(e)
76
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
Solución.
77
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
S=3+6+8+10 = 27
Solución.
return suma
Solución.
#invertir los elementos de la cola circular
def invertir_cola_cir(self,CC):
PA=Pilas()
while (not CC.vacio()):
e = CC.eliminar()
PA.adiciona(e)
while (not PA.vacio()):
CC.adicionar(PA.elimina())
78
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="8":
cont=col.cuenta_elementos()
print("cuenta:",cont)
elif opcion=="*":
break
else:
print("opcion no valida")
menuPrin()
79
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
6.1 Definición.
La recursividad (recursión) es aquella propiedad que posee una función por la cual
dicha función puede llamarse a sí misma. Se puede utilizar la recursividad como
una alternativa a la iteración. Una solución recursiva es normalmente menos
eficiente en términos de tiempo de computadora que una solución iterativa debido
a las operaciones auxiliares que llevan consigo las llamadas suplementarias a las
funciones; sin embargo, en muchas circunstancias el uso de la recursión permite a
los programadores especificar soluciones naturales, sencillas, que serían, en caso
contrario, difíciles de resolver. Por esta causa, la recursión es una herramienta
poderosa e importante en la resolución de problemas y en la programación.
(Joyanes Aguilar, 2008)
Funciones recursivas
Procedimientos recursivos
80
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
caso base: son casos simples, si la función es llamada con el caso base
la función simplemente devuelve un resultado
caso recursivo: la función es llamada de forma recursiva hasta llegar al
caso base.
Condición: Una función recursiva debe una condición y sea para llamar
al caso recursivo o al caso base.
Solución.
El caso base del programa recursivo, esta dada por la definición del factorial, es
decir, cuando N=0 su factorial será 1
N! = N * (N-1)!
(N-1)! = (N-1) * (N-2)!
(N-2)! = (N-2) * (N-3)!...
81
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
1 Si N=0
Factorial(N) =
N*Factorial(N-1) Si N>0
120
fase fase
Factorial(6) = 6 * Factorial (5) 1 Factorial(6) = 6* Factorial (5) = 6 * 120 = 720 2
24
Factorial(5) = 5* Factorial (4) Factorial(5) = 5* Factorial (4) = 5 * 24 = 120
6
Factorial(4) = 4* Factorial (3) Factorial(4) = 4* Factorial (3) = 4 * 6 = 24
2
Factorial(3) = 3* Factorial (2) Factorial(3) = 3* Factorial (2) = 3 * 2 = 6
1
Factorial(2) = 2* Factorial (1) Factorial(2) = 2* Factorial (1) = 2 * 1 = 2
1
Factorial(1) = 1* Factorial (0) Factorial(1) = 1* Factorial (0) = 1 * 1 = 1
Factorial(0) = 1 Factorial(0) = 1
82
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
Z= XY = X * X * X * X * ………… * X
Y – veces
Z=XY = 23 = 2 * 22 = 8
Z=XY = 23 = 4 * 21 = 8
Z=XY = 23 = 8 * 20 = 8
83
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
1 Si Y=0
Potencia(X,Y) =
X*Potencia(X,Y-1) Si Y>0
Z = 24 = 16.
fase
Potencia(2,4)= 2 * Potencia (2,3) 1
Potencia(2,0)= 1
8 Fase 2
Potencia(2,4)= 2 * Potencia (2,3) = 2 * 8 = 16
4
84
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Potencia(2,0)= 1
# calcula la potencia de x
def potencia(self, x, y):
if (y == 0):
return (1) 1
else:
return (x * self.potencia(x, y - 1))
Solución.
C = A + B = A +( 1 + 1 + 1+ 1 + ……..+1)
B – veces
C = 8 + 3 = 8 + ( 1 + 1 + 1) = 11
C = 8 + 3 = 8 + ( 1 + 1 + 1) = 11
sumaDosNúmeros(a,b) =
85
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
1 + sumaDosNumeros(a- Si a>0
1,b)
C = 5 + 3 = 5 + ( 1 + 1 + 1) = 11
sumaDosNumeros(4,3)= 1 + sumaDosNumeros(3,3)
sumaDosNumeros(3,3)= 1 + sumaDosNumeros(2,3)
sumaDosNumeros (0,3)= 3
7
Fase 2
sumaDosNumeros(5,3) = 1+ sumaDosNumeros(4,3)= 1 + 7 =8
6
sumaDosNumeros(4,3) = 1+ sumaDosNumeros(3,3)= 1 + 6 =7
5
sumaDosNumeros(3,3) = 1+ sumaDosNumeros(2,3)= 1 + 5 =6
4
sumaDosNumeros(2,3) = 1+ sumaDosNumeros(1,3)= 1 + 4 =5
3
sumaDosNumeros(1,3) = 1+ sumaDosNumeros(0,3)= 1 + 3 =4
sumaDosNumeros(0,3) = 3
Solución.
C = A * B = ( A + A + A+ A + ……..+A)
B – veces
C = 8 * 3 = ( 8 + 8 + 8) = 24
C = 8 * 3 = ( 8 + 8 + 8) = 24
0 Si
b=0
multiplicaDosNumeros(a,b) =
a + multiplicaDosNumeros(a,b- Si
1) b>0
C = 8 * 3 = 24
87
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
fase
multiplicaDosNumeros(8,3)= 8 + multiplicaDosNumeros(8,2) 1
multiplicaDosNumeros(8,0)= 0
16 Fase
multiplicaDosNumeros(8,3) = 8 + multiplicaDosNumeros(8,2)= 8 + 16 =24 2
8
multiplicaDosNumeros(8,2) = 8 + multiplicaDosNumeros (8,1)= 8 + 8 =16
0
multiplicaDosNumeros(8,1) = 8 + multiplicaDosNumeros (8,0)= 8 + 0 =8
multiplicaDosNumeros(8,0) = 0
Solución.
88
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
A B
0 Si a<b
divideDosNumeros(a,b) =
1 + divideDosNumeros(a-b,b) Si
a>=b
89
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
A B
10 2
(1) 5 2
(1) 2 2
(0) 1
‖ Log 75 ‖ = 0
0 Si n <
b
Logaritmo(n,b) =
1 + logaritmo(n/b,b) Si n>=b
90
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
A B
10 3
(1) 3
Solución
A B
a Si a<b
91
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Mod(a,b) =
Mod(a-b,b) Si a>=b
Solución.
X= 18 12 6
Y= 6
Para encontrar el caso base sera cuando X sea igual a Y (X=Y) cuando
esto sucede el máximo común divisor es X o puede ser Y, por ejemplo
Mcd(18,18) = 18.
X Si x=y
Mcd(x,y-x) Si x<y
92
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
N B
25 2
(1) 12 2
(0) 6 2
(0) 3 2
(1) 1 2
(1) 0
El resultado será los residuos (11001) de cada división leídos de abajo hacia
arriba, tal como se ve en ejemplo.
Para encontrar el caso base sera cuando (N<B), es decir, es cuando se deja de
dividir,por ejemplo si N=1 y B=2 el resultado sera 1, porque ( N<B => 1 < 3).
93
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
N Si n<b
=
Cbase(n,b)
n mod b + Cbase(n / b, b) * 10 Si n>=b
Solución
0 Si n=0
= 1 Si n=1
Fibonaci(n)
Fibonaci(n-1) + Fibonaci(n-2) Si n>1
94
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
NI = 0
N NI=NI*10 + R
1234 10 NI = 0 * 10 + 4 = 4
(4) 123 10 NI = 4 * 10 + 3 = 43
R (3) 12 10 NI = 43 * 10 + 2 = 432
R (1) 0
0 Si n=0
invertir(n) =
Invertir(n/10) + (n mod 10) * 10 (longitud (n) – 1)¨ Si n>1
# Invertir un numero
def invertir(self, n):
if (n == 0):
return (0)
else:
return (self.invertir(n // 10) + (n % 10) *
(self.potencia(10, self.cuentaDigitos(n) - 1))) 95
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Solución.
123 10 C=1
(3) 12 10 C=2
(2) 1 10 C=3
(1) 0
0 Si
n=0
CuentaDigitos(n) =
1 + CuentaDigitos(n/10) Si
n>0
Ejemplo
V= 1 5 2 4 5 6
* 0 1 2 3 4 5
La suma S=1+5+2+4+5+6 = 23
Para suma el vector de forma recursiva se empieza de N=6 hasta llegar a la
primera posición 0.
0 Si n = 0
SumaVec(V,n) =
N=2631 S=2+6+3+1 = 12
Solución.
S=0
97
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
N S=S+R
2631 10 S=S+1=1
R (3) 26 10 S = 4 + 6 = 10
R (6) 2 10 S = 10 + 2 = 12
R (2) 0
0 Si N=0
SumaDigitos(N) =
Ejemplo
V=
10 5 2 1 5 6
0 1 2 3 4 5
Em = 10 5 2 1
Tamaño del vector N=6
Elemento Menor EM = 1
98
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Palabra= h o l a
0 1 2 3
Donde la longitud de la palabra es 4
““ Si n = 0
invertirCad(palabra,n) =
Solución.
true Si n = 0
Par( N ) =
Impar( N – 1 ) Si n > 0
Impar( N ) =
par( N – 1 ) Si n > 0
Ejemplo
Si N= 5 Entonces N es positivo
Solución.
True Si n < 0
Positivo( N ) =
Negativo( N – 1 ) Si n <= 0
False Si n = 0
101
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Negativo( N ) =
Positivo( N – 1 ) Si n > 0
102
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para buscar un elemento en un vector V, los datos del vector tiene que estar
ordenado los elementos.
Si N = 1
Hanoi( N ) =
2 * Hanoi ( N – 1 ) + 1 Si N > 0
N=6
V= 1 2 7 9 10 13
0 1 2 3 4 5
Solución
entonces menor = 2 + 1
103
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
V= 1 2 7 9 10 13
0 1 2 3 4 5
Entonces menor = 4 + 1 = 5
V= 1 2 7 9 10 13
0 1 2 3 4 5
V= 1 2 7 9 10 13
0 1 2 3 4 5
Menor
Medio
Mayor
# Busqueda Binaria
def buscarBinaria(self,V, menor, mayor, elemento):
media = (mayor + menor) // 2
valorMedio = V[media]
print(valorMedio)
if menor > mayor:
return -1
elif valorMedio == elemento:
return media
elif valorMedio < elemento:
104
return self.buscarBinaria(V, media+1, mayor, elemento)
else:
return self.buscarBinaria(V, menor, media-1, elemento)
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Ejemplo
Si fila = 3 , columna = 4
0 1 2 3
0 1 5 6 2
M = 1 2 6 7 1
2 1 3 4 5
S = 1 + 5 + 6 + 2 + 2 + 6 + 7 + 1 + 1 + 3 + 4 + 5 = 43
Solución.
Los elementos de la matriz se suman elemento a elemento, y la función recursiva
es la siguiente.
int suma (int fila, int col, int orden, int mat [] [])
{
if (fila == 0 && col == 0)
return mat [0] [0];
else
if (col < 0)
return suma (fila - 1, orden, orden, mat);
else 105
return mat [fila] [col] + suma (fila, col - 1, orden, mat);
}
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
V= 5 2 1 7 10 13
0 1 2 3 4 5
Emenor = 1
El programa recursivo es la siguiente.
Solución.
A= 1 6 2 4 1 6
0 1 2 3 4 5
B= 5 2 1 7 2 3
0 1 2 3 4 5
106
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
C= 6 8 3 11 3 9
0 1 2 3 4 5
Para poder sumar dos matrices, la condición base es, que ambas matrices
deben ser del mismo tamaño y se suma es elemento a elemento. Por
ejemplo
Fil = 3 Col = 4
A B C
2 4 5 6 4 1 2 3 6 5 7 9
+ =
1 3 4 3 3 4 2 1 4 7 6 4
1 2 3 4 8 9 7 2 9 11 10 6
3x4 3x4
3x4
En el ejemplo las matrices son del mismo tamaño pòr lo tanto se puede
realizar la suma.
107
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
void suma2Mat(int A[][], int B[][], int C[][], int fil, int col, int n) {
if (fil != 0) {
if (col != 0) {
C[fil - 1][col - 1] = A[fil - 1][col - 1] + B[fil - 1][col - 1];
suma2Mat(A, B, C, fil, col - 1, n);
} else {
suma2Mat(A, B, C, fil - 1, n, n);
}
}
}
}
“Yo no enseño a mis alumnos, solo les proporciono las condiciones en las que
puedan aprender.”
Albert Einstein.
7.1. Definición
La estructura de dato lista, es una estructura lineal y dinamica. Lineal porque a cada
elemento le puede seguir solo otro elemento; dinamica porque se puede manejar la
memoria de manera flexible, sin la necesidad de reservar espacios con antelación.
Las listas enlazadas son colecciones de elementos llamados nodos; el orden entre
estos se establece por medio de un tipo de datos denominado punteros,
apuntadores, direcciones o referencias a otros nodos(Cairo & Guardati, 2008)
108
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Nodo
Donde:
Información : Información que se almacena en el nodo.
Siguiente : Almacena la dirección del siguiente nodo de la lista, el ultimo
nodo de la lista apunta a nulo.
109
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
110
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
class Nodo(object):
dato = None
sigte = None
def __init__(self):
self.dato = None
self.sigte = None
Cuando se inserta un elemento al principio se tiene dos casos que la lista este vacia
o que la lista L tenga datos.
111
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
q
Q
En ambos casos el código será la siguiente.
Cuando la Lista es
vacia Cuando la lista tiene datos, el puntero r se debe
posicionar al final de la lista con el siguiente algorítmo
r = self.L
L while r.sigte!=None:
r = r.sigte
q
En el primer caso
cuando la lista esta
vacia, el algorítmo es Una vez que el puntero r se posiciona al final el
la siguiente. código de enlace es la siguiente
q = Nodo() r.sigte = q
q.dato=e q.sigte = None;
112
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para insertar un elemento “e” antes de un elemento “a”, primero se debe buscar el
elemento “a” si existe se inserta, caso contrario no se inserta.
w r
q
También puede darse el caso que el elemento a insertar sea al principio, por
ejemplo. Si e=9 y a= 6
L r
113
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para insertar un elemento “e” después del elemento “d”, primero se debe buscar el
elemento “d”, si existe se inserta, caso contrario no se inserta.
q
También puede darse el caso que el elemento a insertar este al final de la lista L,
por ejemplo. Si e=9 y d= 20
114
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
q
El código de una lista ordenada L será la siguiente.
115
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para eliminar un elemento del principio o inicio, se debe utilicar un puntero auxiliar
r, es decir r debe tomar la posición de L (r=L), luego L se debe mover a la siguiente
nodo (L=L,siguiente), de forma grafica se representa de la siguiente forma.
De la siguiente forma.
L
r
Una vez que el puntero L se mueve al siguiente nodo, la lista quedara de la siguiente
forma.
116
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para eliminar un elemento del final de una lista L, se debe utilizar un puntero r,
donde r inicia donde se encuentra el puntero L (r=L), luego r debe mover hasta el
ultimo nodo, y también se debe tener otro puntero auxiliar w, que este antes que el
puntero r, la lista tendrá la siguiente configuración.
w r
una vez que r esta en el ultimo nodo de la lista L, se elimina y w debe apuntar a null,
de forma grafica será de la siguiente forma.
117
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Por ejemplo.
Para eliminar un elemento X, primero debe existir dicho elemento en la lista, en caso
de existir se elimina, caso contrario no se elimina.
Si X= 6
r
118
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Si X= 20
w r
Si x= 15
w r
w.siguiente = r.siguiente
119
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
120
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Ejercios
Solucion.
Solucion.
121
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
122
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
package Listas;
import javax.swing.JOptionPane;
public class FormListaSimple extends javax.swing.JFrame {
Listas_Simples lista = new Listas_Simples();
double elemento;
public FormListaSimple() {
initComponents();
setBounds(10, 10, 950, 500);
}
…………..
…………..
Solución.
123
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
def get_ci(self):
return self.ci
def get_pat(self):
return self.pat
def get_mat(self):
return self.mat
def get_nom(self):
return self.nom
def get_dir(self):
return self.dir
def get_salario(self):
return self.salario
124
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
#Inicializa la lista
def crea(self):
self.listaEmp = None
#Adiciona un empleado
def adicionaInicio(self, datoEmp):
q = NodoEmpleado()
q.emp = datoEmp
q.sigte = self.listaEmp
self.listaEmp = q
125
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
126
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="2":
print("INGRESE DATOS DEL EMPLEADO")
ci = input("C.I.:")
pat = input("Paterno:")
mat = input("Materno:")
nom = input("Nombre:")
dire = input("Direccion:")
salario =float(input("Salario:"))
datEmp=Empleado()
datEmp.set_empleado(ci,pat,mat,nom,dire,salario)
listaEmp.adicionaInicio(datEmp)
elif opcion=="3":
print ("ELIMINACION DE EMPLEADO POR CI")
ci=int(input("Ingrese C.I."))
listaEmp.eliminaEmpleado(ci)
elif opcion=="4":
print("LISTADO DE EMPLEADOS")
print("c.i.\tNombre\tPaterno\tNombre\tDireccion\t
Salario ")
ds=listaEmp.mostrarEmpleado()
print(ds)
elif opcion=="5":
print("BUSQUEDA DE DATOS POR NOMBRE DE EMPLEADO")
nom=input("Ingrese Nombre a buscar:")
ds=listaEmp.buscarNombre(nom)
print(ds)
elif opcion=="*":
break
else:
print("opcion no valida")
#Llamada a menu principal
menuPrincipalEmpleado()
Las listas circulares son similares a las listas simplemente enlazadas. Sin embargo,
tiene las características de que ultimo elemento de la lista apunta al primero, en
lugar de apuntar al vacio.(Cairo & Guardati 2008)
127
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
128
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
class Nodo(object):
dato = None
sigte = None
def __init__(self):
self.dato = None
self.sigte = None
nodo.
mport random
from NodoL import Nodo
class ListaSimpleCircular(object):
L = None
…….
Cuando se inserta un elemento al principio se tiene dos casos que la lista circular,
esta vacia o que la lista LC tenga datos.
129
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
130
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Cuando la Lista es
vacia Si la lista tiene datos, el puntero r=LC, y el puntero r debe
recorrer la lista hasta llegar al ultimo elemento.
r = self.L
while r.sigte != self.L:
r = r.sigte
r.sigte = q
El código será q.sigte = self.L
Nodo q = new
Nodo();
una vez que se ha enlazado la lista, de forma grafica debe
q = Nodo() quedar de la siguiente manera.
q.dato = e
if self.L is
None:
self.L = q
q.sigte =
self.L
or lo tanto el algorítmo completo se muestra a continuación.
Para insertar un elemento “e” antes de un elemento “a”, primero se debe buscar el
elemento “a” si existe se inserta, caso contrario no se inserta.
131
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Puede darse el caso de que el elemento a insertar este al principio de la lista LC.
Para insertar un elemento “e” después del elemento “d”, primero se debe buscar el
elemento “d”, si existe se inserta, caso contrario no se inserta.
132
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
También puede darse el caso que el elemento a insertar este al final de la lista LC,
por ejemplo. Si e=8 y d= 20
133
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para eliminar un elemento del principio o inicio de la lista LC, se debe utilizar un
puntero auxiliar r, es decir r debe tomar la posición de LC (r=LC), luego LC se debe
mover a la siguiente nodo (LC=LC.siguiente), a continuación se representa de
forma grafica en la siguiente figura.
Puede darse el caso que la lista circular LC, puede tener un solo Nodo, cuando se
elimina la lista LC debe apuntar a null, como se muestra en la siguiente figura.
134
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Para eliminar un elemento del final de una lista LC, se debe utilizar un puntero
auxiliar r, donde r inicia donde se encuentra el puntero LC (r=LC), luego r debe
mover hasta el ultimo nodo, y también se debe tener otro puntero auxiliar w, que
este antes que el puntero r, la lista LC se muestra con la siguiente configuración.
Una vez que r esta en el ultimo nodo de la lista LC, se elimina y w debe apuntar al
primer nodo de la lista LC, tal como se ve en la siguiente figura.
Puede darse el caso que la lista circular LC, puede tener un solo Nodo, cuando se
elimina la lista LC debe apuntar a null, como se muestra en la siguiente figura.
135
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Por ejemplo.
Para eliminar un elemento X, primero debe existir dicho elemento en la lista, en caso
de existir se elimina, caso contrario no se elimina.
Si X= 45
136
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Si X= 20
Una vez que r esta en el ultimo nodo de la lista LC, se elimina y w debe apuntar al
primer nodo de la lista LC, tal como se ve en la siguiente figura.
Si x= 6
137
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Puede darse el caso que la lista circular LC, puede tener un solo Nodo, y el elemento
buscado sea el único elementos de la lista LC., dicha lista LC debe apuntar a null,
como se muestra en la siguiente figura.
138
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
139
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
140
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
Mediante una lista circular simple administrar los datos de un producto cuyos
atributos son las siguientes(idprod, descripción, marca, procedencia, cantidad,
precio, stockmaximo, stockminimo). Realizar las siguientes operaciones (crear,
adicionar, elimina un X producto, listar productos por descripción, listar productos
agotarse)
Solución
141
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
142
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
143
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
class NodoProducto(object):
def __init__(self):
self.datoProd = None
self.sigte = None
144
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
145
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
146
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
147
ESTRUCTURA DE DATOS CON LENGUAJE JAVA UN ENFOQUE PRÁCTICO
elif opcion=="*":
break
else:
print("opcion no valida")
#Llamada al programa principal
menuPrincipalProductos()
148