Ok allora l'idea è questa:
- contare le parentesi: va bene come hai fatto te (ed è quello che si fa di solito), per questo ho usato stack_p.
- assicurarti che le lettere siano uguali all'interno di esse (uso un altro stack, stack_c)
Ti serve un altro stack in grado di ricordarti quale lettera stavi controllando prima di incontrare un'altra parentesi aperta.
In sostanza:
- quando vedi una parentesi aperta imposta aperture = true
- quando vedi una lettera:
- se aperture è true aggiungila allo stack e metti aperture = false
- altrimenti controlla se il top dello stack è uguale
- quando vedi una parentesi chiusa devi poppare da tutti e due gli stack
Il codice probabilmente è un po' incasinato, spero che più che altro ti sia chiara l'idea, l'implementazione è una conseguenza:
Codice:
public static boolean checkString(String input) {
LinkedList<Character> stack_p = new LinkedList<Character>();
LinkedList<Character> stack_c = new LinkedList<Character>();
boolean aperture = false;
for (int i=0; i<input.length(); i++) {
char ch = input.charAt(i);
if (ch=='<') {
aperture = true;
stack_p.push(ch);
}
else
if (ch=='>') {
if (!stack_c.isEmpty())
stack_c.pop();
try {
stack_p.pop();
}
catch (NoSuchElementException ex) {
return false;
}
}
else {
if (aperture) {
stack_c.push(ch);
aperture = false;
}
else {
char check = stack_c.pop();
if (check != ch) return false;
else stack_c.push(ch);
}
}
}
if (stack_p.isEmpty() && stack_c.isEmpty())
return true;
else
return false;
}
Edit: ora vedo se si può usare uno stack solo (in teoria dovrebbe essere possibile)