Pilhas: mudanças entre as edições
Linha 56: | Linha 56: | ||
#define TAM 100 | #define TAM 100 | ||
struct pilha { | struct pilha { | ||
int | int topo; | ||
int itens[TAM]; | int itens[TAM]; | ||
}; | }; | ||
Linha 65: | Linha 65: | ||
void push(struct pilha *p, int item) | void push(struct pilha *p, int item) | ||
{ | { | ||
p->itens[p-> | p->itens[p->topo++] = item; | ||
} | } | ||
</source> | </source> | ||
:Esta operação faz p->itens[p-> | :Esta operação faz p->itens[p->topo] = item e depois incrementa topo. | ||
Poderia também fazer um controle de erro para verificar se o tamanho da pilha são será ultrapassado: | Poderia também fazer um '''controle de erro''' para verificar se o tamanho da pilha são será ultrapassado: | ||
<source lang="c"> | <source lang="c"> | ||
void push(struct pilha *p, int item) | void push(struct pilha *p, int item) | ||
{ | { | ||
if (p-> | if (p->topo == TAM) { | ||
fputs("Erro: overflow\n", stderr); | fputs("Erro: overflow\n", stderr); | ||
abort(); | abort(); | ||
} else | } else | ||
p->itens[p-> | p->itens[p->topo++] = item; | ||
} | } | ||
</source> | </source> | ||
Linha 86: | Linha 86: | ||
void pop(struct pilha *p) | void pop(struct pilha *p) | ||
{ | { | ||
return p->itens[--p-> | return p->itens[--p->topo]; | ||
} | } | ||
</source> | </source> | ||
:Esta operação decrementa top e depois retorna p->itens[top]. | :Esta operação decrementa top e depois retorna p->itens[top]. | ||
<!-- | |||
Poderia também fazer um controle de erro para verificar se a pilha não está vazia: | Poderia também fazer um controle de erro para verificar se a pilha não está vazia: | ||
<source lang="c"> | <source lang="c"> | ||
void push(struct pilha *p, int item) | void push(struct pilha *p, int item) | ||
{ | { | ||
if (p-> | if (p->topo == 0) { | ||
fputs("Erro: underfow\n", stderr); | fputs("Erro: underfow\n", stderr); | ||
abort(); | abort(); | ||
} else | } else | ||
return p->itens[--p->top]; | return p->itens[--p->topo]; | ||
} | |||
</source> | |||
--> | |||
;Operação top: Retorna o item do topo da pilha, sem extraí-lo. | |||
<source lang="c"> | |||
void top(struct pilha *p) | |||
{ | |||
return p->itens[p->topo]; | |||
} | |||
</source> | |||
;Operação empty: Verifica se a pilha está vazia. | |||
<source lang="c"> | |||
int empty(struct pilha *p) | |||
{ | |||
if (p->topo == 0) | |||
return -1; | |||
else | |||
return 1; | |||
} | } | ||
</source> | </source> |
Edição das 14h26min de 19 de setembro de 2014
Pilhas
Uma pilha é um conjunto ordenado de itens, na qual novos item podem ser inseridos ou extraídos a partir de seu topo [1].
Uma pilha é um objeto dinâmico, constantemente mutável a partir da inserção ou extração de itens, sempre a partir de seu topo.
Quando um novo item é inserido na pilha, ele passa a ocupar seu topo. Neste caso, o topo é deslocado para cima de modo a corresponder ao novo primeiro elemento. Quando um item é removido, o topo da pilha é deslocado para baixo, para apontar ao novo primeiro elemento.
Operações primitivas com pilhas
As duas operações primitivas para lidar com pilhas são [1]:
- push: Quando um elemento é inserido, ou empilhado, na pilha;
- pop: Quando um elemento é extraído, ou desempilhado, da pilha.
- Funções para operar com pilhas
Considere uma pilha s e um item i, a função
push(s, i);
insere o item na pilha.
Por sua vez a função
i = pop(s);
extrai um item do topo da pilha.
Outra operação que pode ser utilizada é verificar o item do topo da pilha, sem extrai-lo
i = top(s);
Não existe um limite máximo para o número de item em uma pilha. Entretanto, se uma tiver um só elemento e ele for extraído, teremos a pilha vazia. Portanto, antes de utilizar o operador pop, precisamos verificar se a pilha não está vazia.
A operação
empty(s);
verifica se a pilha está vazia ou não.
Exemplo de aplicação de pilhas
Imlementação de pilhas em linguagem C
Antes de programar a solução de um problema usando pilhas, é preciso definir como a pilha será representada na linguagem de programação que estamos utilizando.
Na linguagem C, uma das maneiras de implememtar uma pilha é utilizando vetores. Contudo, pilhas e vetores são tipos de dados diferentes:
- Uma pilha é um conjunto ordenado de itens de tamanho é variável e, a princípio, não tem limite de tamanho.
- Um vetor, por sua vez, é um conjunto ordenado de itens, cujo tamanho é fixado na declaração do vetor.
Entretando, podemos utilizar um vetor para implementar uma pilha, desde que este vetor seja declarado suficientemente grande para conter a pilha que pretendemos implementar. Uma extremidade do vetor será o final fixo da pilha, enquanto o topo da pilha se desloca constantemente a medida que elementos são inseridos ou extraídos da pilha[1].
Implementando pilhas com vetores
Uma implementação de uma pilha em C pode ser realizada a partir da declaração de uma estrutura com dois campos[2]:
- Um vetor de items para armazenar os elementos da pilha;
- Um inteiro que aponta para o topo da pilha dentro do vetor.
Ver também[3]
- Uma pilha de inteiros pode ser declarada como
#define TAM 100
struct pilha {
int topo;
int itens[TAM];
};
- Operação push
- Insere item no topo da pilha.
void push(struct pilha *p, int item)
{
p->itens[p->topo++] = item;
}
- Esta operação faz p->itens[p->topo] = item e depois incrementa topo.
Poderia também fazer um controle de erro para verificar se o tamanho da pilha são será ultrapassado:
void push(struct pilha *p, int item)
{
if (p->topo == TAM) {
fputs("Erro: overflow\n", stderr);
abort();
} else
p->itens[p->topo++] = item;
}
- Operação pop
- Extrai item no topo da pilha.
void pop(struct pilha *p)
{
return p->itens[--p->topo];
}
- Esta operação decrementa top e depois retorna p->itens[top].
- Operação top
- Retorna o item do topo da pilha, sem extraí-lo.
void top(struct pilha *p)
{
return p->itens[p->topo];
}
- Operação empty
- Verifica se a pilha está vazia.
int empty(struct pilha *p)
{
if (p->topo == 0)
return -1;
else
return 1;
}
Referências
- ↑ 1,0 1,1 1,2 TENENBAUM, A. A.; LANGSAM, Y.; AUGENSTEIN, M.J. Estruturas de dados usando C, capítulo 2: A Pilha, São Paulo: Makron Books, 1995.
- ↑ Wikipedia: Stack. http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29#Implementation
- ↑ FEOFILOFF, p. Projeto de algoritmos em C: Pilhas. http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html
--Evandro.cantu (discussão) 16h49min de 17 de julho de 2014 (BRT)