¿Cuál es la diferencia entre una matriz y una pila?

10

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?

Dinámica
fuente
55
¿Cómo no responde a su pregunta lo que encontró en Wikipedia? Puede acceder a los elementos de una matriz en cualquier orden; Se debe acceder a una pila en orden LIFO.
Caleb
8
@Caleb El hecho de que leas algo no significa que entiendas el concepto. En mi mente, no entendí completamente esto hasta que pregunté.
Dinámico
3
-1 Básicamente publicaste la respuesta en tu propia pregunta. ¿Qué es lo que estás preguntando, de nuevo?
Andres F.
1
@AndresF. No puedo entender qué significa eso ... Si pudieras mirar un artículo de Wikipedia y entender lo que dicen la primera vez, el mundo sería perfecto.
Dinámico
2
Acabo de leer meta.programmers y entendí por qué hiciste esta pregunta: es para un concurso. Dudo seriamente que no hayas entendido el artículo de Wikipedia. La culpa es tuya: /
Andres F.

Respuestas:

45

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, Peeky Pop, 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á).

Mason Wheeler
fuente
11
bloques de madera - bonita analogía
Jesse Black
1
Dices "en una pila, no hay operación de acceso aleatorio" pero no estoy de acuerdo, y agregaré más detalles en mi respuesta.
Scott Whitlock
las pilas definitivamente se implementan con acceso aleatorio
old_timer
44
Debes chupar a Jenga.
DisgruntledGoat
1
@Mason, lo sé. Que era una broma.
DisgruntledGoat
6

En una pila puro, las únicas operaciones permitidas son Push, Popy Peekaunque en términos prácticos, eso no es exactamente cierto. O, más bien, la Peekoperació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.

Scott Whitlock
fuente
Para mí esta es la respuesta. La cuestión de cuál es la diferencia entre una matriz y una pila se reduce a por qué necesitamos pila cuando la matriz parece menos restringida y más versátil. Y esto lo responde: es exactamente porque la pila está más restringida que usarla en casos adecuados (por ejemplo, llamadas a funciones aquí) hace que el implemento sea lógico. Henco "la belleza"
Todanley
4

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

chrisjleaf
fuente
3

Sus responsabilidades son diferentes:

  • 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

CodeART
fuente
3

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.

Jesse Black
fuente
0

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
1
En el dominio de 'estructuras para almacenar colecciones de objetos', no diría que son muy similares. En el dominio de los conceptos de programación, diría que son bastante similares. En el dominio de las cosas en general, diría que son casi idénticas.
Kirk Broadhurst
0

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.

FrustratedWithFormsDesigner
fuente
0

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.

viejo contador de tiempo
fuente