Pilas y Colas(Estructura de datos).
Pues mi duda radica en que si mejor aprender en un lenguaje como C, las pilas y las colas(Estructuras de datos).
En que se basan los apuntadores? y que se agregaria para una mejor enseñanza de Estructuras de datos?. El profesor pregunto en que lenguaje quieren implementar las clases todos dijieron java que tan bueno es?
Si alguien tiene o conoce de un libro(Seria un gran aporte).
A muchos de mis compañeros de clase les va servir si ven este post y pienso que a alguna persona que ande buscando por ahi en internet.
Ya hay dos comentarios Acerca de este tema por Parte de @Ezamudio y @OscarRyz:
Comentario de Ezamudio
Comentario de OscarRyz
@Ezamudio en la clase 9 de threads, usas colas en uno de los ejemplos si no mal me equivoco tienen algo en comun las colas y los threads?
Porcierto me sirvio mucho, de hecho hasta lo usea para una exposicion de la Unidad III que trata sobre Threads(Programacion concurrente Multihilo).
Saludos. Gracias por su comentario que aporten.
- Inicie sesión o regístrese para enviar comentarios
Estructuras
Muchas dudas... voy en reversa. No, colas y threads no tienen absolutamente nada que ver. Y no entiendo cómo es que ya estás dando exposiciones de Threads si no has visto estructuras de datos tan básicas como colas y pilas, pero eso es bronca del plan de estudios de tu escuela.
Ya lo he dicho varias veces y lo vuelvo a decir: yo no considero que Java sea un buen lenguaje para aprender a programar. Y ciertamente no es un buen lenguaje para aprender apuntadores y estructuras de datos, primero porque no puedes manejar apuntadores de manera explícita como en C, y segundo porque tienes que manejar objetos a fuerzas, por lo que no puedes hacer tus propias estructuras (si las quieres manejar sin usar objetos, sería incluso más enredado que en C).
No digo que tengas que dominar C pero me parece que C es muy bueno para poder aprender las cosas más básicas porque es más directo (como dicen por ahí, C es ensamblador con azúcar sintáctica). Puedes alojar espacios en memoria y tienes que liberarlos después; puedes crear apuntadores a regiones en memoria que no creaste tú, o que tal vez ni alojadas están; puedes intentar liberar memoria que no estaba realmente alojada para tu programa; en fin le puedes dar en la torre a tu programa de maneras que no son posibles en Java o lenguajes más avanzados. Y hay razones muy válidas para que hayan aislado esos problemas en esos lenguajes, pero cuando estás aprendiendo, es bueno que conozcas esos problemas.
Cuando ves apuntadores en C ya te queda muy clara la diferencia entre heap y stack, la manera en que funcionan las variables no sólo en C sino en muchos otros lenguajes (incluyendo Java), la manera en que hay que manejar la memoria dinámica, etc. Y con las estructuras de datos como pilas, colas, listas enlazadas (simples, dobles, etc) como tienes que armarlas desde cero, totalmente a manita, no se te va a olvidar cómo funcionan aunque nunca más lo vuelvas a tener que hacer de esa manera. En Java, .NET, python, ruby, php, etc ya vas a usar las implementaciones de arreglos, listas, mapas/diccionarios, pilas, colas etc que te ofrezca el lenguaje o alguna librería externa de Apache o quien sea, pero al menos ahora ya tendrás una idea de cómo funcionan "debajo del cofre" y sobre todo saber cuál debes usar según sea el caso.
Apuntadores
Y creo que es mejor que primero aprendan a manejar apuntadores muy simples y luego ya se metan a ver lo de pilas y colas. Un ejemplo extremadamente sencillo de apuntadores en C, es un apuntador a un entero (que no es lo mismo que tener una variable tipo entero porque esa es una referencia estática).
#include <stdio.h>
int main(char*argv[], int argc) {
int a = 5;
int *b = malloc(sizeof(int));
*b = 5;
if (a == b) { //Esto da warning al compilar pero jala
printf("a y b valen lo mismo? WTF?!?!?!\n");
} else {
printf("a y b no valen lo mismo porque b es un apuntador a un entero\n");
}
if (a == *b) {
printf("a y *b valen lo mismo (*b es el entero al que hace referencia b)\n");
} else {
printf("a y *b no valen lo mismo? ah caray\n");
}
printf("a=%d b=%d *b=%d &b=%d\n", a, b, *b, &b);
free(b);
}
Lo anterior te da algo como esto (aunque los valores de b y &b van a cambiar mucho porque son direcciones en memoria):
Pero bueno ya es mucho C y este es un sitio de Java jajajajaja....
wow, desempolvaste tu gaveta
wow, desempolvaste tu gaveta de C??? :) :)
C
jajajaj no, no fue necesario; lo que bien se aprende...
Lo interesante es saber que hasta con la variable
a
puedes hacer lo de&a
para saber en dónde está (de manera estática) y con eso por ejemplo puedes tener una función que espera como parámetro unint *
y le pasas&a
y cuando dentro de la función le pongan un valor al parámetro, sí se va a modificar el valor dea
(a diferencia de recibir unint
donde al asignarle un valor dentro de la función, el valor que tenía fuera de la función no se ve afectado). Y luego puedes tener apuntadores a apuntadores, por ejemplo una función que recibe unint **
pero ya es como de ocultismo informático.Borland
Borland c++ fue donde aprendi a programar, no lo vi asi muy extenso el lenguaje hacia pinitos, adivina tu signo zodiacal, operaciones de numeros, calculo de areas ,etc..etc y si como comentas ezamudio el sistema educativo pues se esta quedando estancado creo todavia siguen dando Visual basic en la prepa y Visual fox pro pero bueno es la triste historia..
Gracias por la explicacion @ezamudio me sacaste muchas dudas y aprendi algo nuevo(Desde que entre al foro he tenido mejoras).
Saludos.
Arraystack
Alguien tiene por ahi algun tutorial de Stack?
O si conocen algun libro y me lo pases se los agradeceria?
Saludos.
Stack. El primer elemento
Stack. El primer elemento que entra es el ultimo que sale, y listo. No creo que haya muchos libros sobre el tema.
Lo puedes implementar con un array, y tiene generalmente tres métodos. push, pop, y peek ( meter, sacar y ver que hay hasta arriba )
Aquí te va una implementación muy simple ( e incompleta )
data = Array[Object]( size=10 )
position=-1;
// mete un elemento a la pila
push( o : Object ) {
position = position .+ 1
data.at( position , value = o )
}
// ve el elemento que está hasta arriba
peek() : Object {
return data.at( position )
}
// saca y devuelve un elemento de la pila.
pop() : Object {
o = peek();
data.at( position, value= null )
position = position .- 1
return o;
}
main() {
s = Stack();
s.push("a")
s.push("b")
s.push("c")
out.print( s.peek() ) // "c"
out.print( s.pop() ) // "c"
out.print( s.pop() ) // "b"
out.print( s.pop() ) // "a"
}
}
Stack/Pila
Si no te queda claro el concepto, agarra 5 libros e implementa una pila en el mundo real. Pon un libro sobre la mesa. Luego pon otro libro encima. Luego otro. El último libro que pusiste en la pila, es el único que puedes tomar. Cada que pones un libro encima de otro, es un push. Cada que tomas el libro de hasta arriba, es un pop. Si quieres sacar el libro que está sobre la mesa, tienes que quitar uno por uno los libros que tiene encima, tomando siempre el de hasta arriba. Es como torres de Hanoi, con una sola torre.
La implementación que puso Oscar te permite manejar una pila de hasta 10 objetos. El peek es una operación que te permite ver el objeto que está hasta arriba, sin quitarlo de la pila. Ahí faltan unas validaciones o que se arrojen ciertas excepciones: Si ya metiste 10 objetos a la pila y quieres meter uno más, se desborda la pila (StackOverflow). Si la pila está vacía y quieres tomar un objeto, podrías devolver null (si es que la pila no permite agregar null a la misma) o puedes crear una condición de StackUnderflow.
Vida real?
Podrían regalarnos algunos ejemplos de la vida real de dónde aplicar estas estructuras de datos? algún lugar donde digas no se puede hacer si no meto por ejemplo un stack? Sé que debe haber dónde si no no existieran pero no me ha tocado toparme con algo asi y me gustaría conocer algunos ejemplos
gracias de antemano
stack
pues el ejemplo mas claro de un stack es que no puedes tener un programa ni en Java ni en C ni en ningun otro lenguaje si no manejas un stack. La funcion A llama a la funcion B que llama a la C que llama a la D... todo eso se va poniendo en una pila, para que cuando la funcion D termine con un return, el control de la ejecucion regresa a la funcion C y cuando esa termina, el control regresa a la funcion B y cuando esa termina regresa el control a la funcion A y cuando esa termina, dado que fue la primera, el programa termina.
Bien
Gracias por la respuesta, pero me refería más a un lugar donde ustedes hayan aplicado en sus desarrollos ;)