View Single Post
Old 07-03-2010, 12:18   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12919
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)

Ultima modifica di WarDuck : 07-03-2010 alle 12:23.
WarDuck è offline   Rispondi citando il messaggio o parte di esso