Qual é a diferença entre uma matriz e uma pilha?


10

Segundo a Wikipedia, uma pilha :

é o último tipo de dados abstratos e estrutura de dados linear (LIFO).

Enquanto uma matriz :

é uma estrutura de dados que consiste em uma coleção de elementos (valores ou variáveis), cada um identificado por pelo menos um índice ou chave de matriz.

Tanto quanto eu entendo, eles são bastante semelhantes. Então, quais são as principais diferenças? Se eles não são os mesmos, o que uma matriz pode fazer que uma pilha não pode e vice-versa?


5
Como sua pergunta não é respondida pelo que você encontrou na Wikipedia? Você pode acessar os elementos de uma matriz em qualquer ordem; uma pilha deve ser acessada na ordem LIFO.
Caleb

8
@ Caleb Só porque você lê algo não significa que você entende o conceito. Na minha cabeça, eu não entendi completamente até perguntar.
Dynamic

3
-1 Você basicamente postou a resposta em sua própria pergunta. O que você está perguntando de novo?
Andrés F.

11
@AndresF. Não consigo entender o que isso significa ... Se você pudesse olhar para um artigo da Wikipedia e entender o que eles estão dizendo pela primeira vez, o mundo seria perfeito.
Dynamic

2
Acabei de ler meta.programmers e entendi por que você fez essa não pergunta: é para um concurso. Eu duvido seriamente que você não tenha entendido o artigo da Wikipedia. Que vergonha: /
Andres F.

Respostas:


45

Bem, certamente você pode implementar uma pilha com uma matriz. A diferença está no acesso. Em uma matriz, você tem uma lista de elementos e pode acessar qualquer um deles a qualquer momento. (Pense em um monte de blocos de madeira dispostos em uma fileira.)

Mas em uma pilha, não há operação de acesso aleatório; há apenas Push, Peeke Pop, todos os quais lidam exclusivamente com o elemento no topo da pilha. (Pense nos blocos de madeira empilhados verticalmente agora. Você não pode tocar em nada abaixo do topo da torre ou ela cairá.)


11
blocos de madeira - boa analogia
Jesse Preto

11
Você diz "em uma pilha, não há operação de acesso aleatório", mas eu discordo e adicionarei mais detalhes na minha resposta.
Scott Whitlock

pilhas são definitivamente implementado com acesso aleatório
old_timer

4
Você deve ser péssimo em Jenga.
DisgruntledGoat

11
@Mason, eu sei. Foi uma piada.
DisgruntledGoat

6

Em uma pilha pura, as únicas operações permitidas são Push, Pope, Peekmas em termos práticos, isso não é exatamente verdade. Ou melhor, a Peekoperação geralmente permite que você olhe para qualquer posição da pilha, mas o problema é que ela é relativa à única extremidade da pilha.

Então, como outros já disseram, uma matriz é de acesso aleatório e tudo é referenciado no início da matriz .

Em uma pilha, você só pode adicionar / remover no final de trabalho da pilha, mas você ainda tem acesso aleatório, mas é referenciado ao final de trabalho . Essa é a diferença fundamental.

Por exemplo, quando você passa parâmetros em uma pilha para uma função, o receptor não precisa exibir os parâmetros para vê-los. Ele apenas empurra variáveis ​​locais na pilha e faz referência a todas as variáveis ​​e parâmetros locais com base em um deslocamento do ponteiro da pilha. Se você estivesse usando apenas uma matriz, como o receptor saberia onde procurar por seus parâmetros? Quando o chamado é concluído, ele exibe suas variáveis ​​locais, pressiona um valor de retorno, retorna o controle para o chamador e o chamador exibe o valor de retorno (se houver) e, em seguida, os parâmetros da pilha. O bom é que ele funciona, não importa o quão aninhado você esteja em suas chamadas de função (supondo que você não fique sem espaço na pilha).

Esse é um uso / implementação específico, mas ilustra a diferença: a matriz é sempre referenciada desde o início, mas as pilhas são sempre referenciadas em alguma posição final de trabalho.

Uma possível implementação de uma pilha é uma matriz mais um índice para lembrar onde está o final de trabalho.


Para mim, esta é a resposta. A questão de qual é a diferença entre uma matriz e uma pilha se resume a por que precisamos da pilha quando a matriz parece menos restrita e mais versátil. E isso responde: é exatamente porque a pilha é mais restrita que o uso em casos adequados (por exemplo, chamadas de função aqui) torna o implemento lógico. Henco "a beleza"
Todanley

4

Eu acho que a maior confusão que está acontecendo aqui é a implementação versus estruturas básicas de dados.

Na maioria (linguagens mais básicas), uma matriz representa um conjunto de elementos de tamanho fixo que você pode acessar em um determinado momento. O fato de você ter vários elementos como esse não diz nada sobre como ele deve ser usado (e, francamente, um computador não sabe / se importa com o uso, contanto que você não viole o uso).

Uma pilha é uma abstração usada para representar dados que devem ser tratados de uma certa maneira. Este é um conceito abstrato, porque apenas diz que precisa ter alguma sub-rotina / método / função que possa ser adicionada ou removida da parte superior, enquanto os dados abaixo da parte superior não são tocados. É sua escolha usar uma matriz dessa maneira.

Você pode criar uma pilha com muitos tipos diferentes de estruturas de dados: matrizes (com algum tamanho máximo), matrizes dinâmicas (podem crescer quando estiver sem espaço) ou listas vinculadas. Pessoalmente, acho que uma lista vinculada representa as restrições de uma pilha da melhor maneira possível, pois você precisa se esforçar um pouco para ver as coisas além do primeiro elemento e é muito fácil adicionar à frente e remover da frente.

Então você pode usar uma matriz para criar uma pilha, mas elas não são equivalentes


3

Suas responsabilidades são diferentes:

  • A pilha deve ser capaz de inserir elementos na pilha e empurrá-los da pilha, daí o motivo pelo qual normalmente possui métodos Pop()ePush()

  • A responsabilidade da matriz é obter / definir o elemento em um índice especificado


3

Você pode recuperar um item de qualquer índice de uma matriz A \.

Com uma pilha, você pode recuperar um item no meio da pilha A, usando outra pilha: B.

Você continua tirando o item superior de A e colocando-o em B até chegar ao item desejado de A, depois coloca os itens de B novamente no topo da pilha A.

Portanto, para dados que exigem a capacidade de recuperar um índice arbitrário, é mais difícil trabalhar com a pilha.

Na situação em que você deseja o comportamento "último a entrar, primeiro a sair", uma pilha fornecerá menos sobrecarga que uma matriz.


0

Eu não chegaria ao ponto de dizer que eles são "muito parecidos".

Uma matriz é usada para armazenar coisas que serão acessadas posteriormente sequencialmente ou através do índice. A estrutura de dados não implica nenhum tipo de método de acesso (FIFO, LIFO, FILO, etc ...), mas pode ser usada dessa maneira, se você quiser.

Uma pilha é uma maneira de rastrear as coisas conforme elas são geradas. Um método de acesso é implícito / necessário, dependendo do tipo de pilha criada. Uma pilha de quadros seria um exemplo LIFO. Isenção de responsabilidade - posso estar misturando minha taxonomia de estrutura de dados aqui e uma pilha pode realmente permitir apenas o LIFO. Caso contrário, seria um tipo diferente de fila.

Então, eu poderia usar uma matriz como uma pilha (embora não desejasse), mas não posso usar uma pilha como uma matriz (a menos que eu trabalhe muito nisso).


11
No domínio das 'estruturas para armazenar coleções de objetos', eu não diria que elas são muito semelhantes. No domínio dos conceitos de programação, eu diria que eles são bastante semelhantes. No domínio das coisas em geral, eu diria que são quase idênticas.
Kirk Broadhurst

0

Os dados em uma matriz podem ser acessados ​​por uma chave ou índice. Os dados em uma pilha podem ser acessados ​​quando são retirados da parte superior da pilha. Isso significa que acessar dados de uma matriz é fácil se você conhece seu índice. Acessar dados de uma pilha significa que você deve continuar aparecendo elementos até encontrar o que estava procurando, o que significa que o acesso a dados pode demorar mais tempo.


0

Uma matriz é da perspectiva dos programadores, fixa no local e no tamanho, você sabe onde está e onde está a coisa toda. Você tem acesso a tudo isso.

Com uma pilha, você fica sentado em uma das extremidades, mas não tem idéia do tamanho ou do quão longe pode ir com segurança. Seu acesso a ele é limitado à quantia que você alocou, muitas vezes você nem sabe se, ao alocar a quantia que queria, se tivesse acabado de bater no heap ou no espaço do programa. Sua visão de uma pilha é uma pequena matriz que você alocou, o tamanho que você queria, você tem controle e pode ver. Sua parte não é diferente de uma matriz. A diferença é que sua matriz está presa a uma extremidade de outra matriz por razões de argumento e terminologia, das quais você não tem visibilidade, não tem idéia de quão grande ou pequeno, e você não pode tocá-la sem causar danos. Uma matriz, a menos que global, é geralmente implementada na pilha de qualquer maneira, portanto, a matriz e a pilha compartilham o mesmo espaço pela duração dessa função.

Se você deseja entrar no lado do hardware, é claro que é específico do processador, mas geralmente a matriz é baseada em um ponto / endereço de partida conhecido, o tamanho é conhecido pelo compilador / programador e os endereços são computados, às vezes, usando o endereçamento de deslocamento de registro (carrega um valor do endereço definido por esse valor de registro base mais esse valor de registro de deslocamento, da mesma forma que quando compilado, poderia ser um deslocamento imediato, não necessariamente baseado em registro, depende do processador, é claro) que na montagem se assemelha a acessar uma matriz em código de alto nível. Da mesma forma, com a pilha, se disponível, você pode usar o registro ou o endereçamento de deslocamento imediato, geralmente usando um registro especial, o próprio ponteiro da pilha ou um registro reservado pelo compilador / programador a ser usado para acessar o quadro da pilha para esse função. E para alguns processadores, funções especiais de acesso à pilha são usadas e / ou necessárias para acessar a pilha. Você tem instruções push e pop, mas elas não são usadas com a frequência que você imagina e realmente não se aplicam a essa pergunta. Para alguns processadores, push e pop são aliases de instruções que podem ser usadas com qualquer registrador, em qualquer lugar, não apenas com o ponteiro da pilha na pilha, removendo ainda mais o push e pop de serem relacionados a esta pergunta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.