[Ajuda] Ler String e colocar na pilha

Quero criar um método que irá ler uma String composta por números, caracters(. + - / *), espaços e palavras, Ex: 10 5 81 7 + * dup . preciso diferenciar o que é int, char e String e colocar em suas respectivas pilhas(tem uma pra cada tipo, não posso por td em uma genérica) o espaço é o separador. Meu problema é que não to conseguindo extrair os elementos da String estava usando o charAt, porém ele pega 1 a 1 se eu tenho, por exemplo, o número 81 ele irá pegar o 8 e colocar na pilha e dps o 1 separadamente. Existe alguma maneira de pegar o 81 completo?

Espero que tenha conseguido expressar minha duvida.

grato

Bom, se toda String tiver um padrão, que seria separar cada um por espaço, então seria possível sim.

Criando um array de String a partir dos espaços utilizando .split() eu consigo separar cada um deles.

	public static void main(String[] args) {
		String e = "10 5 81 7 + * dup a",
			   e2[] = e.split(" ");
		// e2 = [10, 5, 81, 7, +, *, dup]
	}

Muito obrigado, ajudou bastante, porém ainda preciso percorrer esse vetor e verificar o que inteiro, string, char para distribuir nas pilhas.

Tentei pegar o elemento por posição e fazer o instanceof para comprar, mas não deu certo alguma sugestão, só falta essa parte para finalizar o trabalho =, o resto dos métodos estão todos ok

fiz isso

    Object [] e = txt.split(" "); //Achei que fosse object conseguiria fazer a comparação
            for(int i = 0; i < e.length; i++){
                if(e[i] instanceof Integer){
                    pilhaInt.push((int)e[i]);
                }

A única forma que eu consegui foi utilizando .matches(), para checar se a String contém número ou letras utilizando uma Expressão Regular, ficando mais ou menos assim :

if (s.matches("\\d+")) { // \d é para checar se há um número dentro da String e ( + ) é para checar se ocorre uma ou mais repetições
	    System.out.println(s + " é um numero");
		// adiciona "s" na pilha de números
}

Para não dar a resposta logo de cara, que não seria muito legal vou falar como é feito o resto, que é basicamente a mesma coisa, é só repetir esse mesmo if com “\w+” (para saber se há letras, uma ou mais repetições ) no lugar de “\d+

e para saber se é um char, para não se confundir com o “\w+” eu usei “s.length() == 1” antes de checar se há letras. Nesse não usa matches, é só essa comparação mesmo.

Deu td certo, muito obrigado, o método ficou assim dps de pronto

public void addListas(String txt) {
    String[] e = txt.split(" ");
    pilhaInt = new StaticStack<Integer>(e.length);
    pilhaChar = new StaticStack<Character>(e.length);
    pilhaString = new StaticStack<String>(e.length);
    pilhaNomes = new StaticStack<String>(e.length);
    
    for (int i = 0; i < e.length; i++) {
        if (e[i].matches("\\d+")) {
            pilhaInt.push(Integer.parseInt(e[i]));
        } else {
            if (e[i].length() == 1) {
                char [] aux = new char [0];
                aux = e[i].toCharArray();
                pilhaChar.push(aux[0]);
                operacoesChar(); //Faz a operação de acordo com o caracter, se for * multiplica o top com o subtop na pilha de inteiros
                aux = null;
            } else {
                if (e[i].matches("\\w+")) {
                    pilhaString.push(e[i]);
                    operacoesString(); //Faz a operação com a String, se for dup irá duplicar o top da pilha de inteiros
                }
            }
        }
    }
}
1 curtida