Un flux est essentiellement caractérisé par
une opération read qui renvoie « le truc suivant ».
En Java les flux de caractères sont réalisés par la classe Reader
.
Reader
.
Qu'est-ce au fond qu'unRead a single character. This method will block until a character is available, an I/O error occurs, or the end of the stream is reached.
public int read() throws IOException Returns:
The character read, as an integer in the range 0 to 16383 (0x00-0xffff), or -1 if the end of the stream has been reached
Throws: IOException
If an I/O error occurs (sic).
char
de Java ? «-1
»
est-il un caractère ? Pourquoi read renvoie-t-elle un int
?
On décide de décrire les graphes orientés par des fichiers texte et selon les conventions suivantes :
->
,
et le point-virgule ;
.
Les mots peuvent être séparés par des blancs (espaces, sauts de
lignes, etc.)
->
d1 d2 … dk ;
» définisssant les arcs
s → d1, s → d2, …s → dk.
Par exemple :
10 0 -> 9 6 ; 1 -> 8 0 ; 2 -> 7 4 ; 4 -> 9 7 3 ; 5 -> 8 ; 6 -> 5 1 ; |
Token
des mots (ou lexèmes),
écrire le code.
Lexer
des analyseurs lexicaux
réalisée selon le
principe du flux. On ne se donnera pas la peine d'écrire le code des
méthodes.
Graph (Reader in)
pour la classe
suivante des graphes.
class Graph { // Graphes orientés private List [] succ ; Graph (int size) { succ = new List[size] ;} void arc(int src, int dst) { succ[src] = new List (dst,succ[src]) ; } |
Voici deux classes définissant les arbres n-aires
class Tree { // Arbres n-aires int node ; Forest children ; Tree (int node, Forest children) { this.node = node ; this.children = children ; } } class Forest { // Une liste de Tree Tree first ; Forest next ; Forest (Tree first, Forest next) { this.first = first ; this.next = next ; } } |
Une forêt est donc une liste ordonnée d'arbres. Dans un arbre, l'ordre gauche-droit des sous-arbres compte, il compte aussi dans une forêt. Enfin la racine de chaque arbre est identifiée par un entier, dans le champ node.
La définition des arbres est inductive, on pourrait aussi l'écrire ainsi :
|
(En supposant en outre que tous les entiers n sont distincts.)
Voici quelques méthodes supplémentaires pour la classe Graph
.
Tree dfsTree(int node, boolean [] vu) { return new Tree(node, dfsForest(succ[node], vu)) ; } Forest dfsForest(List nodes, boolean [] vu) { if (nodes == null) return null ; int node = nodes.val ; if (!vu[node]) { vu[node] = true ; Tree t = dfsTree(node, vu) ; Forest f = dfsForest(nodes.next, vu) ; return new Forest (t, f) ; } else return dfsForest(nodes.next, vu) ; } Forest dfs(List nodes) { boolean [] vu = new boolean [succ.length] ; return dfsForest(nodes, vu) ; } Forest dff() { List allNodes = null ; for (int i = succ.length-1 ; i >= 0 ; i--) allNodes = new List (i, allNodes) ; return dfs(allNodes) ; } |
1 -> 0
, 5 -> 8
,
4 -> 9
et 2 -> 7
.
Ajouter ces arcs à la forêt et caractériser les nouveaux arcs en
fonction de leur nature, arcs de retour, transverses, et de descente.
|
Ce document a été traduit de LATEX par HEVEA