3.2.2. Reprezentace zásobníku pomocí dynamického pole

Pokud nám nevyhovuje to, že musíme předem určit maximální velikost zásobníku a chtěli bychom velikost zásobníku přizpůsobit podle potřeby, můžeme při přetečení zásobníku automaticky zvětšit velikost pole, do něhož ukládáme hodnoty. Asi není příliš praktické toto zvětšování provádět při vkládání každého prvku, neboť každé zvětšení vyžaduje přidělení paměti pro nové pole a kopírování obsahu pole původního. Můžeme tedy na začátku vytvořit pole určité počáteční velikosti a v případě, že jeho velikost nebude stačit, zvětšíme ho o určitý přírůstek velikosti. Obě tyto hodnoty zadáme v konstruktoru zásobníku.

Pro implementaci zásobníku dynamickým polem můžeme s výhodou využít dědičnosti a rozšířit již implementovanou třídu ArrayStack. Definujeme nový konstruktor, který navíc uloží velikost přírůstku, a před provedením původní operace push() nejprve zajistíme případné zvětšení pole o zadaný přírůstek.

public class DynamicArrayStack extends ArrayStack 
{ 
  public DynamicArrayStack(int size, int delta) { 
    super(size); 
    assert delta > 0; 
    _delta = delta; 
  } 
 
  public void push(Object obj) { 
    if( _top == _data.length ) { 
      Object[] nove = new Object[_top + _delta]; 
      for(int i = 0; i < _top; i++) 
        nove[i] = _data[i]; 
      _data = nove; 
    } 
    super.push(obj); 
  } 
 
  protected int _delta; 
}