OVH Cloud OVH Cloud

gestion de pile

5 réponses
Avatar
kurtz le pirate
bonjour, je voudrais gérer une pile fifo. pour l'instant je fais :

...
# --- remplissage du tableau
for($index=0;$index<$dim;$index++) {
$tableau[$index]=[$index,alea(100),alea(100)];
}
# --- affichage
print "--- tableau initial\n";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]\n";
}

# --- decalage avec perte du dernier element
for($index=$dim-2;$index>=0;$index--) {
$tableau[$index+1]=[$index+1,$tableau[$index][1],$tableau[$index][2]];
}
# --- affichage
print "---tableau apres declage\n";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]\n";
}

# --- insertion nouvel element
$tableau[0]=[0,alea(100),alea(100)];
# --- affichage
print "--- nouvel element insere\n";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]\n";
}
...

voyez vous un autre moyen ? j'ai pas vraiment compris l'utilité des
shift, unshift...

merci

--
klp

5 réponses

Avatar
Sébastien Cottalorda
kurtz le pirate wrote:
bonjour, je voudrais gérer une pile fifo. pour l'instant je fais :

...
# --- remplissage du tableau
for($index=0;$index<$dim;$index++) {
$tableau[$index]=[$index,alea(100),alea(100)];
}
# --- affichage
print "--- tableau initialn";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]n";
}

# --- decalage avec perte du dernier element
for($index=$dim-2;$index>=0;$index--) {
$tableau[$index+1]=[$index+1,$tableau[$index][1],$tableau[$index][2]];
}
# --- affichage
print "---tableau apres declagen";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]n";
}

# --- insertion nouvel element
$tableau[0]=[0,alea(100),alea(100)];
# --- affichage
print "--- nouvel element inseren";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]n";
}
...

voyez vous un autre moyen ? j'ai pas vraiment compris l'utilité des
shift, unshift...


Salut,

J'utilise beaucoup push pour remplir un tableau et shift pour le vider
en concervant l'ordre d'insertion.

L'avantage, c'est que je n'ai pas besoin de connaître (et donc de gérer)
la taille de mon tableau.
J'utilise toujours ce couple dans le cas d'un tableau qui contient à
chaque élément quelque chose => la détection de undef me dit que le
buffer est vide (utilisation dans la gestion des buffers de socket par
exemple).

Mais on peut y arriver aussi avec ta méthode.

There is more than one way to do that ....

Sébastien

Avatar
Paul Gaborit
À (at) Thu, 11 May 2006 17:39:17 +0200,
kurtz le pirate écrivait (wrote):
bonjour, je voudrais gérer une pile fifo. pour l'instant je fais :

...
# --- remplissage du tableau
for($index=0;$index<$dim;$index++) {
$tableau[$index]=[$index,alea(100),alea(100)];
}


foreach my $index (0..$dim-1) {
push @tableau, [$index,alea(100),alea(100)];
}

# --- affichage
print "--- tableau initialn";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]n";
}


foreach my $index (0..$#tableau) {
print "$index : ",
join("/", map {$tableau[$index][$_]} 0..2),
"n";
}


# --- decalage avec perte du dernier element
for($index=$dim-2;$index>=0;$index--) {
$tableau[$index+1]=[$index+1,$tableau[$index][1],$tableau[$index][2]];
}


# c'est bizarre comme opération :
# le premier élément est dupliqué !
# mais on fait quand même ;-)

# suppression du dernier élément
pop @tableau;
# duplication du premier element
# (et donc decalage de tous les autres)
unshift @tableau, [@{$tableau[0]}];

# recalcul de l'index qui est stocké (inutilement) dans les valeurs.
$tableau[$_][0] = $_ foreach 0..$#tableau;

# --- affichage
print "---tableau apres declagen";
for($index=0;$index<$dim;$index++) {
print "$index :
$tableau[$index][0]/$tableau[$index][1]/$tableau[$index][2]n";
}


idem qu'au-dessus....

# --- insertion nouvel element
$tableau[0]=[0,alea(100),alea(100)];

voyez vous un autre moyen ? j'ai pas vraiment compris l'utilité des
shift, unshift...



pop : suppression (et récupération) du dernier élément du tableau

push : ajout d'un élément après le dernier élément

shift : suppression (et récupération) du premier élément du tableau

unshift : ajout d'un élément avant le premier élément (et donc
décalage de tous les autres)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul Gaborit
À (at) Thu, 11 May 2006 20:46:35 +0200,
Sébastien Cottalorda écrivait (wrote):
[...]
Mais on peut y arriver aussi avec ta méthode.

There is more than one way to do that ....


Certes mais l'utilisation des fonctions pop, push, shift et unshift
est tout de même largement plus rapide qu'une gestion "à la main" !!!

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
kurtz le pirate
In article ,
Paul Gaborit wrote:

[snip]

pop : suppression (et récupération) du dernier élément du tableau

push : ajout d'un élément après le dernier élément

shift : suppression (et récupération) du premier élément du tableau

unshift : ajout d'un élément avant le premier élément (et donc
décalage de tous les autres)


merci paul (comme d'habitude...) pour toutes ses infos.

si l'on veut avoir un pile de taille fixe, il faut gérer la suppression
du dernier élément ?


en fait mon exemple est mal choisie. c'est pour ça que tu trouves des
"choses bizarres". la vrai utilisation sera de stocker dans
$tableau[0]=[$heure,$v1,$v2].

donc à chaque nouvel "instant", je fais :
- pop @tableau;
- unshift @tableau [$h,$v1,$v2];

j'ai bon ? :)


--
klp

Avatar
Paul Gaborit
À (at) Fri, 12 May 2006 18:22:15 +0200,
kurtz le pirate écrivait (wrote):
donc à chaque nouvel "instant", je fais :
- pop @tableau;
- unshift @tableau [$h,$v1,$v2];


Avec la virgule qui va bien :

- unshift @tableau, [$h,$v1,$v2];

j'ai bon ? :)


Ou l'inverse :

shift @tableau;
push @tableau, [$h,$v1,$v2];

En fait, ça dépend de l'ordre qu'on veut conserver dans @tableau. :-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>