Reconhecer objetos de uma stack / Utilização Iterator

[code]public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.GRAY);
g.fillRect(0, 8, 250, 34);

    for(int i = 0; i<stack.size(); i++)
    {
        stack.elementAt(i).desenhar(g);
        if(stack.elementAt(i).colorir)
            stack.elementAt(i).colorir(g, stack.elementAt(i).getX(), stack.elementAt(i).getY());      
    }
    repaint();
}

class Listener implements ActionListener
{
    public JButton b;
    private Mouse mouse;
    
    public Listener(JButton b)
    {
        this.b = b;
    }        

    public void actionPerformed(ActionEvent e) 
    {
        addMouseListener(mouse = new Mouse());
        mediator.setDisable(buttons, b);
        Poligono.desenhar = true;
        
        if(b == desfazer)
        {
            mediator.setEnable(buttons);
            stack.remove(stack.lastElement());
                /*stack.iterator().next();
                
                if(stack.iterator().next() == stack.lastElement())
                    stack.iterator().remove();*/
            
        }
        
        if(b == desfazerCirculo)
        {
            mediator.setEnable(buttons);
        }    
    }
    
    class Mouse implements MouseListener
    {
        
        public void mouseClicked(MouseEvent e) {
            if(b == quadrado && Quadrado.desenhar)
            {
                stack.push(new Quadrado(e.getX(), e.getY(), 50, 50));
                Poligono.desenhar = false;
                mediator.setEnable(buttons);
                removeMouseListener(mouse);
            }
            else if(b == circulo && Circulo.desenhar)
            {
                stack.push(new Circulo(e.getX(), e.getY(), 50, 50));
                Poligono.desenhar = false;
                mediator.setEnable(buttons);
                removeMouseListener(mouse);
            }
            else if(b == pintar)
            {
                for(int i = 0; i<stack.size(); i++)
                {
                    if(e.getX()>= stack.elementAt(i).getX() && e.getY()>=stack.elementAt(i).getY() && e.getX()<=(stack.elementAt(i).getX()+stack.elementAt(i).getWidth()) && e.getY()<=(stack.elementAt(i).getY()+stack.elementAt(i).getHeight()))
                    {
                        stack.elementAt(i).colorir = true;
                    }
                }
                mediator.setEnable(buttons);
                removeMouseListener(mouse);
            }  
        }[/code]

Esse código é parte dum trabalho que tenho que entregar. Estou com alguns problemas: deveria ser feita uma pilha de figuras, o que eu fiz (chamei a classe de Polígono). Nesse mini-paint devem existir métodos de desfazer a última figura, desfazer o último quadrado e desfazer o último círculo. O problema está na implementação desses 2 segundos métodos, pois eu não tenho idéia de como ler da pilha se o Poligono é um círculo ou quadrado. Além disso gostaria de ter uma orientação para percorrer e remover elementos da pilha usando Iterator, visto que é um dos requisitos do trabalho.

Obrigado