Según Wikipedia, una pila :
es un tipo de datos abstractos last in, first out (LIFO) y una estructura de datos lineal.
Mientras que una matriz :
es una estructura de datos que consiste en una colección de elementos (valores o variables), cada uno identificado por al menos un índice o clave de matriz.
Por lo que yo entiendo, son bastante similares. Entonces, ¿cuáles son las principales diferencias? Si no son lo mismo, ¿qué puede hacer una matriz que una pila no puede hacer y viceversa?
data-structures
array
stack
Dinámica
fuente
fuente
Respuestas:
Bueno, ciertamente puedes implementar una pila con una matriz. La diferencia está en el acceso. En una matriz, tiene una lista de elementos y puede acceder a cualquiera de ellos en cualquier momento. (Piense en un montón de bloques de madera dispuestos en una fila).
Pero en una pila, no hay operación de acceso aleatorio; solo hay
Push
,Peek
yPop
, todos los cuales tratan exclusivamente con el elemento en la parte superior de la pila. (Piense en los bloques de madera apilados verticalmente ahora. No puede tocar nada debajo de la parte superior de la torre o se caerá).fuente
En una pila puro, las únicas operaciones permitidas son
Push
,Pop
yPeek
aunque en términos prácticos, eso no es exactamente cierto. O, más bien, laPeek
operación a menudo le permite mirar cualquier posición en la pila, pero el problema es que es relativo al extremo de la pila.Entonces, como otros han dicho, una matriz es de acceso aleatorio y todo está referenciado al comienzo de la matriz .
En una pila, solo puede agregar / quitar en el extremo funcional de la pila, pero aún tiene acceso de lectura aleatoria pero se hace referencia al extremo funcional . Esa es la diferencia fundamental.
Por ejemplo, cuando pasa parámetros de una pila a una función, la persona que llama no tiene que quitar los parámetros para verlos. Simplemente inserta variables locales en la pila y hace referencia a todas las variables y parámetros locales en función de un desplazamiento desde el puntero de la pila. Si usara solo una matriz, ¿cómo sabría el destinatario dónde buscar sus parámetros? Cuando finaliza la llamada, extrae sus variables locales, empuja un valor de retorno, devuelve el control a la persona que llama y la persona que llama extrae el valor de retorno (si corresponde), y luego saca los parámetros de la pila. Lo bueno es que funciona sin importar cuán anidado esté en sus llamadas de función (suponiendo que no se quede sin espacio de pila).
Ese es un uso / implementación particular, pero ilustra la diferencia: la matriz siempre se referencia desde el principio, pero las pilas siempre se referencian desde alguna posición final de trabajo.
Una posible implementación de una pila es una matriz más un índice para recordar dónde está el extremo operativo.
fuente
Creo que la mayor confusión que ocurre aquí es la implementación versus las estructuras de datos básicas.
En la mayoría (lenguajes más básicos), una matriz representa un conjunto de elementos de longitud fija a los que puede acceder en cualquier momento. El hecho de que tenga un montón de elementos como este no le dice nada acerca de cómo se supone que debe usarse (y, francamente, una computadora no sabrá / no le importará cómo lo use, siempre que no viole el uso).
Una pila es una abstracción utilizada para representar datos que deben manejarse de cierta manera. Este es un concepto abstracto porque solo dice que debe tener alguna subrutina / método / función que pueda agregarse a la parte superior o eliminarse de la parte superior, mientras que los datos debajo de la parte superior no se tocan. Pura elección de usar una matriz de esta manera.
Puede hacer una pila de muchos tipos diferentes de estructuras de datos: matrices (con un tamaño máximo), matrices dinámicas (pueden crecer cuando no hay espacio) o listas vinculadas. Personalmente, creo que una lista vinculada representa mejor las restricciones de una pila, ya que tienes que esforzarte un poco para ver las cosas más allá del primer elemento y es muy fácil agregarla al frente y quitarla del frente.
Entonces puede usar una matriz para HACER una pila, pero no son equivalentes
fuente
La pila debe ser capaz de hacer estallar elementos en la pila y empujar elementos desde la pila, de ahí por qué normalmente tiene métodos
Pop()
yPush()
La responsabilidad de la matriz es obtener / establecer el elemento en un índice específico
fuente
Puede recuperar un elemento de cualquier índice de una matriz A \.
Con una pila, puede recuperar un elemento en el medio de la pila A, utilizando otra pila: B.
Sigue sacando el elemento superior de A y colocándolo en B hasta que esté en el elemento deseado de A, luego vuelve a colocar los elementos de B en la parte superior de la pila A.
Entonces, para los datos que requieren la capacidad de recuperar un índice arbitrario, es más difícil trabajar con la pila.
En la situación en la que desea un comportamiento de "último en entrar, primero en salir", una pila le dará menos sobrecarga que una matriz.
fuente
No iría tan lejos como para decir que son "muy similares".
Una matriz se usa para guardar cosas a las que luego se accederá secuencialmente o mediante el índice. La estructura de datos no implica ningún tipo de método de acceso (FIFO, LIFO, FILO, etc.), pero puede usarse de esa manera si lo desea.
Una pila es una forma de rastrear las cosas a medida que se generan. Un método de acceso está implícito / requerido dependiendo del tipo de pila que se crea. Una pila de cuadros sería un ejemplo de LIFO. Descargo de responsabilidad: es posible que esté mezclando mi taxonomía de estructura de datos aquí y una pila realmente solo permita LIFO. Sería un tipo diferente de cola de lo contrario.
Por lo tanto, podría usar una matriz como una pila (aunque no quisiera), pero no puedo usar una pila como una matriz (a menos que trabaje realmente duro).
fuente
Se puede acceder a los datos en una matriz mediante una clave o índice. Se puede acceder a los datos en una pila cuando se saca de la parte superior de la pila. Esto significa que acceder a los datos desde una matriz es fácil si conoce su índice. Acceder a los datos de una pila significa que debe seguir apareciendo elementos hasta que encuentre el que estaba buscando, lo que significa que el acceso a los datos puede llevar más tiempo.
fuente
Una matriz es desde la perspectiva de los programadores, fijada en su lugar y tamaño, sabes dónde estás y dónde está todo. Tienes acceso a todo eso.
Con una pila, te sientas en un extremo pero no tienes idea de su tamaño ni de qué tan lejos puedes llegar con seguridad. Su acceso a él está limitado a la cantidad que ha asignado, a menudo ni siquiera sabe si al asignar la cantidad que deseaba si acaba de estrellarse en el montón o el espacio del programa. Su vista de una pila es una pequeña matriz que se ha asignado usted mismo, el tamaño que desea, tiene control y puede ver. Su porción no es diferente a una matriz. La diferencia radica en que su matriz se agrega a un extremo de otra matriz por razones de argumento y terminología, de la que no tiene visibilidad, ni idea de cuán grande o pequeño, y no puede tocarla sin causar daño. Una matriz, a menos que sea global, a menudo se implementa en la pila de todos modos, por lo que la matriz y la pila comparten el mismo espacio durante la duración de esa función.
Si desea entrar en el lado del hardware, entonces es específico del procesador, por supuesto, pero en general la matriz se basa en un punto / dirección de inicio conocido, el compilador / programador conoce el tamaño y las direcciones se calculan en él, a veces utilizando el direccionamiento de desplazamiento de registro (cargue un valor de la dirección definida por este valor de registro base más este valor de registro de desplazamiento, del mismo modo cuando se compila podría ser un desplazamiento inmediato no necesariamente basado en el registro, depende del procesador, por supuesto) que en conjunto se asemeja a acceder a una matriz en código de alto nivel. Del mismo modo con la pila, si está disponible, puede usar el registro o el direccionamiento de desplazamiento inmediato, a menudo aunque use un registro especial, ya sea el puntero de la pila en sí, o un registro reservado por el compilador / programador que se utilizará para acceder al marco de la pila para ese función. Y para algunos procesadores se utilizan y / o se requieren funciones especiales de acceso a la pila para acceder a la pila. Tiene instrucciones push y pop, pero no se usan con tanta frecuencia como podría pensar y realmente no se aplican a esta pregunta. Para algunos procesadores, push y pop son alias de instrucciones que se pueden utilizar con cualquier registro, en cualquier lugar, no solo con el puntero de la pila, eliminando aún más la inserción y el pop de estar relacionados con esta pregunta.
fuente