A ideia é que você tenha uma classe pilha, com todos os métodos que se referem a uma pilha implementados.
Como disse, você não deve ser capaz de remover um elemento de uma posição qualquer de uma pilha, portanto o método remove não deve ficar na classe Pilha.
Esse é um tipo exercício que os professores usam, para mostrar aos alunos que é possível obter o funcionamento de uma estrutura de dados que se deseja, utilizando uma outra estrutura de dados.
Um método removeElemento, capaz de remover um elemento da posição desejada, é interessante, por exemplo, numa estrutura de dados do tipo Lista.
Então, creio que seja interessante você fazer o seguinte:
Crie uma classe Pilha, e implemente seus métodos.
Então crie uma classe, por exemplo, Lista, e coloque um objeto do tipo Pilha como variável de instância nessa classe. Você vai usar essa pilha para armazenar os dados da lista.
Na classe lista, você implementa o método que remove um elemento uma posição enviada por parametro para o método.
Mas como você vai fazer isso, sendo que os dados estão armazenados numa pilha?
É nesse método que você vai instanciar uma Pilha auxiliar. Vai remover elementos da pilha principal, guardando-os provisoriamente na classe auxiliar, até que você encontre o elemento desejado. AO encontrar, você o retira da pilha, e então recoloca os elementos da pilha auxiliar para a pilha principal.