[Ajuda] Ler String e colocar na pilha

4 respostas
S

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

4 Respostas

A

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]
	}
S

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

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.

S

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
                }
            }
        }
    }
}
Criado 19 de novembro de 2017
Ultima resposta 19 de nov. de 2017
Respostas 4
Participantes 2