Definindo uma pilha de caracteres em Java

Definindo uma pilha de caracteres em Java

1. Visão geral

Neste tutorial, discutiremos como criar uma pilhachar em Java. Veremos primeiro como podemos fazer isso usando a API Java e, em seguida, veremos algumas implementações personalizadas.

Stack é uma estrutura de dados que segue o princípio LIFO (Last In First Out). Alguns de seus métodos comuns são:

  • push(E item) - empurra um item para o topo da pilha

  • pop() - remove e retorna o objeto no topo da pilha

  • peek() - retorna o objeto no topo da pilha sem removê-lo

2. Pilha deChar usando a API Java

Java possui uma API integrada chamadajava.util.Stack. Since char is a primitive datatype, que não pode ser usado em genéricos,we have to use the wrapper class of java.lang.Character para criar umStack:

Stack charStack = new Stack<>();

Agora, podemos usar os métodospush,pop epeek com nossoStack.

Por outro lado, podemos ser solicitados a criar uma implementação personalizada de uma pilha. Portanto, examinaremos algumas abordagens diferentes.

3. Implementação personalizada usandoLinkedList

Vamos implementar uma pilhachar usandoLinkedList como nossa estrutura de dados de back-end:

public class CharStack {

    private LinkedList items;

    public CharStack() {
        this.items = new LinkedList();
    }
}

Criamos uma variávelitems que é inicializada no construtor.

Agora, temos que fornecer uma implementação dos métodospush,peek epop:

public void push(Character item) {
    items.push(item);
}

public Character peek() {
    return items.getFirst();
}

public Character pop() {
    Iterator iter = items.iterator();
    Character item = iter.next();
    if (item != null) {
        iter.remove();
        return item;
    }
    return null;
}

Os métodospushepeek estão usando os métodos integrados de aLinkedList. Parapop, primeiro usamos umIterator para verificar se há um item no topo ou não. Se estiver lá, removemos o item da lista chamando o métodoremove _._

4. Implementação personalizada usando uma matriz

Também podemos usar uma matriz para nossa estrutura de dados:

public class CharStackWithArray {

    private char[] elements;
    private int size;

    public CharStackWithArray() {
        size = 0;
        elements = new char[4];
    }

}

Acima, criamos um arraychar, que inicializamos no construtor com uma capacidade inicial de 4. Além disso, temos uma variávelsize para controlar quantos registros estão presentes em nossa pilha.

Agora, vamos implementar o métodopush:

public void push(char item) {
    ensureCapacity(size + 1);
    elements[size] = item;
    size++;
}

private void ensureCapacity(int newSize) {
    char newBiggerArray[];
    if (elements.length < newSize) {
        newBiggerArray = new char[elements.length * 2];
        System.arraycopy(elements, 0, newBiggerArray, 0, size);
        elements = newBiggerArray;
    }
}

Ao empurrar um item para a pilha, primeiro precisamos verificar se nossa matriz tem capacidade para armazená-lo. Caso contrário, criamos uma nova matriz e duplicamos seu tamanho. Em seguida, copiamos os elementos antigos para o array recém-criado e o atribuímos à nossa variávelelements.

Observação: para obter uma explicação de por que queremos dobrar o tamanho do array, em vez de simplesmente aumentar o tamanho em um, consulte esteStackOverflow post.

Finalmente, vamos implementar os métodospeek epop:

public char peek() {
    if (size == 0) {
        throw new EmptyStackException();
    }
    return elements[size - 1];
}

public char pop() {
    if (size == 0) {
        throw new EmptyStackException();
    }
    return elements[--size];
}

Para ambos os métodos, depois de validar que a pilha não está vazia, retornamos o elemento na posiçãosize – 1. Parapop, além de retornar o elemento, diminuímossize em 1.

5. Conclusão

Neste artigo, aprendemos como fazer uma pilhachar usando a API Java e vimos algumas implementações personalizadas.

O código apresentado neste artigo está disponívelover on GitHub.