Recursividade com pilhas

2 respostas
L

Hey pessoal!

Eu estou tendo um problema… Meu objectivo é implementar uma aplicação que leia blocos de duas palavras. É necessário gerar todas as sequências de push e pop possíveis para a primeira palavra. É sobretudo nisto que estou tendo problemas, pois é necessário usar recursividade! Outro objectivo é verificar quando a primeira palavra é igual à segunda, mas isso será mais fácil depois de alguém me ajudar na primeira parte…

obrigado.

p.s.: a operação push é dada pela string “i”, e a pop por “o”

2 Respostas

R

Hehehehehe
Brincadeira, o bicho vem e pede o programa todo feito e ainda passa as restrições de letras :roll:

Enfim, não sei se entendi direito.

Primeiro tens que pegar um texto e separar de duas em duas palavras, certo ?

00 private List<String[]> blocos = new ArrayList<String[]>(); 01 public void static main(String[] args) 02 { 03 texto = texto.trim(); // Remove Espaços do começo e final. 04 separaPalavras(texto); 05 } 06 07 public static void separaPalavras(String texto) 08 { 09 String[] palavras = new String[2]; 10 int meio = texto.indexOf(" "); 11 int fim = texto.indexOf(" ", meio); 12 palavras[0] = (meio != -1) ? texto.substring(0, meio) : texto.substring(0, texto.length()); 13 palavras[1] = (fim != -1) ? texto.substring(meio, fim) : "" ; 14 blocos.add(palavras); 15 texto = substring(fim, texto.length()); 16 if (texto.length() > 0) 17 separaPalavras(texto); 18 }

Com isso ali vais ter as palavras agrupadas. Não tá perfeito, tem que tratar algumas paradinhas, não é a melhor, nem a única solução. Mas como tens que usar recursividade, é um bom exemplo. Se não precisasse, poderias usar um StringTokenizer ou algo do tipo.

Quanto a segunda parte, se eu tb entendi direito, tens que pegar uma palavra tal, ler os caracteres dela e ver se são I ou O e dependendo disso fazer um push ou pop ? Se sim, taí ela, basta adicionar entre a linha 12 e a 13 do código acima, usando como parâmetro o objeto palavras[0].

00 public void pushOuPop(String palavra) 01 { 02 int tamanho = palavra.length(); 03 if (tamanho > 0) 04 { 05 String letra = palavra.substring(0, 1); 06 if (letra.equalsIgnoreCase("i")) 07 { 08 System.out.prinln("Push"); 09 } 10 else if (letra.equalsIgnoreCase("o")) 11 { 12 System.out.println("Pop"); 13 } 14 15 if (tamanho > 1) 16 { 17 pushOuPop(palavra.substring(1, tamanho)); 18 } 19 } 20 }

Pra finalizar:

00 if (palavras[0].equals(palavras[1])) 01 { 02 System.out.println("Palavras iguais no topo e sub-topo da pilha!"); 03 System.out.println("Palavra = " + palavras[0]); 04 }

E isso é só adicionar entre as linhas 13 e 14 do primeiro bloco de código.

No mais era isso, coleguinha, vários exemplos de recursividade pra ti.
Se não tiveres peso na consciência, usa esse código. Do contrário, lê ele, aprende e faz sozinho :twisted:

[]s

L

Era +/- assim.

Eu consegui resolver tudo!

Não era bem os i´s e o´s da palavra. Sabendo à partida que se pode colocar e retirar caracteres dessa String da pilha através de push e pop, o push equivale por exemplo a um ‘i’ e um pop a um ‘o’. O objectivo é gerar todas as sequencias possiveis de push e pop dos caracteres da palavra.

Exemplo:

palavra: ola

Pode fazer push, push, push, pop, pop, pop / push, pop, push, pop, push, pop (…) para este caso tem 20 sequencias

Mas so algumas são válidas outras não. Isto é: ao fazer as operações na palavra é gerada outra palavra, segundo o meu primeiro exemplo -> alo, segundo exemplo -> “” pois faz pop e n esta la nada, so depois envia para a pilha os caracteres seguidos, e entao o resultado continua na mesma, como quando iniciado -> string vazia, resultado =""

No final comparamos a String encontrada, através das operações de push e pop (ou ‘i’ e ‘o’, como lhe queiramos chamar), à segunda palavra do Input. Se for igual devolve ou imprime a sequencia correspondente.

CÓDIGO
%%%%%

import java.io.IOException;
import java.util.Stack;

public class AbordagemA{

public static int tamanho_sequencia=0;
public static String input1="",input2="";

//método main
public static void main(String[] args){

do{	

input1=readLine(100);

if(input1!=null){

input1.trim();

input2=readLine(100).trim();

tamanho_sequencia=input2.length();

System.out.println("[");

/** Start time of the current task */
long startTimeMillis=System.currentTimeMillis();

geraSequencias(tamanho_sequencia*2, 0, 0, “”);

long duration = System.currentTimeMillis() - startTimeMillis;

System.out.println("]");

System.out.println("Total Time: " + (duration) + milisegundos);

}

}while(input1!=null);

}
//método que gera as várias sequências

public static void geraSequencias(int num, int num_is, int num_os, String sequencia){

if(num==0){

if(sequencia.charAt(0)==i)

compara(sequencia.substring(0,sequencia.length()-1));

}

else{

num;

if(num_is<tamanho_sequencia)

geraSequencias(num, num_is+1, num_os, sequencia+"i ");

if(num_os<tamanho_sequencia)

geraSequencias(num, num_is, num_os+1, sequencia+"o ");

}

}
//método que devolve apenas as sequências correctas

public static void compara(String s){

Stack<String> pilha = new Stack<String>();

String resultado="";

int indice=0, var0=0, var1=1, l=s.length();
do{

if(s.charAt(indice)==i){

pilha.push(input1.substring(var0,var1));

var0++;

var1++;

}else if(!pilha.empty()){

resultado+=pilha.pop();

}else break;

indice+=2;

}while(indice<l);
if(resultado.equals(input2))

System.out.println(s);

}

//método para leitura de uma linha
static String readLine (int maxLength){ //utility function to read from stdin

byte lin[] = new byte [maxLength];
int length = 0, car = -1;

try{

while (length < maxLength){

car = System.in.read();

if ((car < 0) || (car == ‘\n)) break;

lin [length++] += car;

}

}catch (IOException e){

return (null);

}
if ((car < 0) && (length == 0)) return (null); //EOF

return (new String (lin, 0, length));

}

}
Criado 11 de março de 2007
Ultima resposta 13 de mar. de 2007
Respostas 2
Participantes 2