Estrutura de dados e algoritmos - pilha

Uma pilha é um tipo abstrato de dados (ADT), comumente usado na maioria das linguagens de programação. É denominado pilha, pois se comporta como uma pilha do mundo real, por exemplo - um baralho de cartas ou uma pilha de pratos, etc.

Uma pilha do mundo real permite operações em apenas uma extremidade. Por exemplo, podemos colocar ou remover um cartão ou prato apenas do topo da pilha. Da mesma forma, Stack ADT permite todas as operações de dados em apenas uma extremidade. A qualquer momento, podemos acessar apenas o elemento superior de uma pilha.

Este recurso torna a estrutura de dados LIFO. LIFO significa Last-in-first-out. Aqui, o elemento que é colocado (inserido ou adicionado) por último é acessado primeiro. Na terminologia da pilha, a operação de inserção é chamadaPUSH operação e operação de remoção é chamada POP Operação.

Representação de pilha

O diagrama a seguir descreve uma pilha e suas operações -

Uma pilha pode ser implementada por meio de Array, Structure, Pointer e Linked List. A pilha pode ser de tamanho fixo ou pode ter uma sensação de redimensionamento dinâmico. Aqui, vamos implementar a pilha usando arrays, o que a torna uma implementação de pilha de tamanho fixo.

Operações básicas

As operações de pilha podem envolver inicializar a pilha, usá-la e, em seguida, desinicializá-la. Além desses itens básicos, uma pilha é usada para as duas operações principais a seguir -

  • push() - Empurrar (armazenar) um elemento na pilha.

  • pop() - Remover (acessar) um elemento da pilha.

Quando os dados são colocados na pilha.

Para usar uma pilha de forma eficiente, precisamos verificar o status da pilha também. Para o mesmo propósito, a seguinte funcionalidade é adicionada às pilhas -

  • peek() - obtém o elemento de dados superior da pilha, sem removê-lo.

  • isFull() - verifique se a pilha está cheia.

  • isEmpty() - verifique se a pilha está vazia.

Em todos os momentos, mantemos um ponteiro para os últimos dados PUSHed na pilha. Como este ponteiro sempre representa o topo da pilha, portanto denominadotop. otop O ponteiro fornece o valor do topo da pilha sem realmente removê-lo.

Primeiro devemos aprender sobre os procedimentos para suportar funções de pilha -

olhadinha()

Algoritmo da função peek () -

begin procedure peek
   return stack[top]
end procedure

Implementação da função peek () na linguagem de programação C -

Example

int peek() {
   return stack[top];
}

está cheio()

Algoritmo da função isfull () -

begin procedure isfull

   if top equals to MAXSIZE
      return true
   else
      return false
   endif
   
end procedure

Implementação da função isfull () na linguagem de programação C -

Example

bool isfull() {
   if(top == MAXSIZE)
      return true;
   else
      return false;
}

está vazia()

Algoritmo da função isempty () -

begin procedure isempty

   if top less than 1
      return true
   else
      return false
   endif
   
end procedure

A implementação da função isempty () na linguagem de programação C é um pouco diferente. Inicializamos top em -1, pois o índice na matriz começa em 0. Portanto, verificamos se top está abaixo de zero ou -1 para determinar se a pilha está vazia. Aqui está o código -

Example

bool isempty() {
   if(top == -1)
      return true;
   else
      return false;
}

Operação Push

O processo de colocar um novo elemento de dados na pilha é conhecido como Operação Push. A operação push envolve uma série de etapas -

  • Step 1 - Verifica se a pilha está cheia.

  • Step 2 - Se a pilha estiver cheia, produz um erro e sai.

  • Step 3 - Se a pilha não estiver cheia, incrementos top para apontar o próximo espaço vazio.

  • Step 4 - Adiciona elemento de dados ao local da pilha, para onde o topo está apontando.

  • Step 5 - Retorna sucesso.

Se a lista vinculada for usada para implementar a pilha, na etapa 3, precisamos alocar o espaço dinamicamente.

Algoritmo para Operação PUSH

Um algoritmo simples para operação Push pode ser derivado da seguinte forma -

begin procedure push: stack, data

   if stack is full
      return null
   endif
   
   top ← top + 1
   stack[top] ← data

end procedure

A implementação deste algoritmo em C é muito fácil. Veja o seguinte código -

Example

void push(int data) {
   if(!isFull()) {
      top = top + 1;   
      stack[top] = data;
   } else {
      printf("Could not insert data, Stack is full.\n");
   }
}

Operação Pop

Acessar o conteúdo removendo-o da pilha é conhecido como Operação Pop. Em uma implementação de array da operação pop (), o elemento de dados não é realmente removido, em vez dissotopé diminuído para uma posição inferior na pilha para apontar para o próximo valor. Mas na implementação de lista vinculada, pop () realmente remove o elemento de dados e desaloca o espaço da memória.

Uma operação Pop pode envolver as seguintes etapas -

  • Step 1 - Verifica se a pilha está vazia.

  • Step 2 - Se a pilha estiver vazia, produz um erro e sai.

  • Step 3 - Se a pilha não estiver vazia, acessa o elemento de dados no qual top está apontando.

  • Step 4 - Diminui o valor do topo em 1.

  • Step 5 - Retorna sucesso.

Algoritmo para Operação Pop

Um algoritmo simples para a operação Pop pode ser derivado da seguinte maneira -

begin procedure pop: stack

   if stack is empty
      return null
   endif
   
   data ← stack[top]
   top ← top - 1
   return data

end procedure

A implementação deste algoritmo em C é a seguinte -

Example

int pop(int data) {

   if(!isempty()) {
      data = stack[top];
      top = top - 1;   
      return data;
   } else {
      printf("Could not retrieve data, Stack is empty.\n");
   }
}

Para um programa de pilha completo em linguagem de programação C, clique aqui .