Considere uma cadeia de caracteres S composta somente dos caracteres (, ), [, ], {e }. Diz-se que S é balanceada se ela possui uma das seguintes formas:
- S = "", isto é, S é uma cadeia de comprimento zero
- S = "(T)"
- S = "[T]"
- S = "{T}"
- S = "TU"
Onde Ue T são cadeias balanceadas.
Em outras palavras, para todo parênteses, colchete e chave esquerdos existe um parênteses, colchete e chave direitos. Por exemplo, {()[()]}é balanceada, mas ([)] não é. Escreva um algoritmo que utilize uma pilha de caracteres para testar quando uma dada cadeia é balanceada.
Código Java
//Autor: Thiago Campos
//Data: 24.10.2012
/**
*
* @author Thiago
*/
import java.util.*;
import javax.swing.JOptionPane;
public class Q1 {
public static void main(String args[]) {
String entrada = JOptionPane.showInputDialog("Informe os caracteres a serem analisados: ");
if (verifica(entrada) == true)
JOptionPane.showMessageDialog(null, "A PILHA ESTÁ BALANCEADA.");
if (verifica(entrada) == false)
JOptionPane.showMessageDialog(null, "A PILHA NÃO ESTÁ BALANCEADA.");
} //fim do main
/*---------------------------------------------------------------------------------
* FUNÇÃO QUE VERIFICA SE A PILHA ESTÁ BALANCEADA OU NÃO
---------------------------------------------------------------------------------*/
public static boolean verifica(String str) {
Stack<Character> pilha = new Stack<Character>(); //refere-se ao topo de uma pilha
//variaveis da classe
char p1 = '(';
char p2 = ')';
char br1 = '{';
char br2 = '}';
char bk1 = '[';
char bk2 = ']';
for (int i = 0; i < str.length(); i++) { //percorre toda a String
//verificação inicial - verifica caracter por caracter
if (str.charAt(i) == p1)
pilha.push(p1);
else if (str.charAt(i) == br1)
pilha.push(br1);
else if (str.charAt(i) == bk1)
pilha.push(bk1);
else if (str.charAt(i) == p2){
if (pilha.isEmpty())
return false;
if (pilha.pop() != p1)
return false;
} //fim do if p2
else if (str.charAt(i) == br2) {
if (pilha.isEmpty())
return false;
if (pilha.pop() != br1)
return false;
} //fim do if br2
else if (str.charAt(i) == bk2) {
if (pilha.isEmpty())
return false;
if (pilha.pop() != bk1)
return false;
} //fim do if bk2
}
return pilha.isEmpty();
} //fim da função verifica
} //fim da Classe Q1
Muito bom cara.
ResponderExcluirTava com uma baita dor de cabeça e essa foi a solução perfeita para o meu problema, que embora não fosse o mesmo, a sua solução me deu a luz de solução. Usei recursividade.
Que bom! Fico satisfeito em saber que mesmo afastado da área esse meu blog continua ajudando pessoas que assim como você, o utiliza como um banco de idéias e não simplesmente para copiarem colar.
Excluircara, Obrigadao!
ResponderExcluirDe alguma forma teu exemplo me ajudou na solução do msm exercício mas usando duas Strings para armazenar as variáveis de abertura e fechamento.
Valeuzao.
Por curiosidade, voltou pra área? e se não, por qual motivo?(se for de boa pra vc falar sobre).
Abc
Fico contente em saber que ajudei de alguma forma pessoas como você.
ExcluirSobre a sua curiosidade... infelizmente não voltei. Precisei me mudar para o interior por causa do trabalho e não tem faculdades próximas... mas sempre que posso, tento conciliar trabalho, a família e os estudos. Tenho feito alguns cursos na área... hoje tenho como hobby a programação... e continuo praticando para não esquecer.
Mais uma vez, agradeço a atenção... desculpa não ter respondido antes.
Um grande abraço e bons estudos.