Índice > Pilha > Alocação Seqüencial de Múltiplas Pilhas

Instituto de Ciências Matemáticas de São Carlos
Departamento de Computação e Estatística
SCE182 - Algoritmos e Estruturas de Dados 1
Profs. Resp.: Graça Pimentel e Maria Cristina

Alocação Seqüencial de Múltiplas Pilhas

Inserção e eliminação na mesma extremidade

Quando mais de uma pilha de elementos de mesmo tipo são utilizadas, em vez de um array para cada pilha, utiliza-se um array comum para todas as pilhas, fazendo com que o espaço disponível de uma seja utilizado pela outra.

Caso 1: Duas Pilhas

Em vez de A1[1..m1] e A2[1..M2], faz-se A[1..M], M maior ou igual a M1+M2.

Consequências:

Caso 2: N pilhas

Sejam as pilhas i tais que:

  type pilha_m: array[1..m] of Tipoelem;
       ind: array[1..n] of indice;
 
  var A: pilha_m;
      topo, base: ind;
Algoritmos imediatos de push e pop na pilha i:

Push i
{ inserção na pilha i}

  procedure push (Var A: pilha_m; topo, base: ind; x:TipoElem, i: integer);
  begin
    if topo[i]=base[i+1] then {Overflow}
    else
      begin
        topo[i]:=topo[i]+1;
        A[topo[i]]:=x;
      end;
  end;

Problema com a última pilha ?
No caso i = n
Pop
{eliminação na pilha i}
  procedure elimina (Var topo, base:ind);
  begin
    if topo[i]=base[i] then {underflow}
    else
      topo[i]:=topo[i-1];
  end;
Overflow ?

A condição de overflow na inserção pode ser adiada se o vetor A tiver algum espaço vazio para uma pilha j, o qual pode ser cedido à pilha i.

Alternativas

Inicialização

O que ocorre se inicializarmos

Problema: teríamos muitos deslocamentos desnecessários nas primeiras inserções.

Solução: inicialização equilibrada - dividir proporcionalmente os m registros entre as n pilhas.


Pilha