begin process at 2012 05 27 19:59:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > IMPLÉMENTATION D'UNE PILE D'ENTIER

IMPLÉMENTATION D'UNE PILE D'ENTIER


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :17/07/2004 Date de mise à jour :17/07/2004 14:19:40 Vu :7 021

Auteur : kod32

Ecrire un message privé
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

 Description

Il s'agit d'une pile d'entier à allocation dynamique. J'ai réalisé ceci pour des opérations sur des graphes (Algorithmie). Ce sera utile pour certains et inutile pour d'autres...

Source

  • #include <stdio.h>
  • int *pile;
  • int pos = 0; //position dans la pile
  • // Initialisation de la pile
  • int InitPile(size_t taille)
  • {
  • pile = (int *)malloc(taille);
  • *pile = taille;
  • if(pile != NULL){ pos = 1; return 0; }
  • return 1;
  • }
  • // Fonction d'empilage des entiers
  • void Empiler(int entier)
  • {
  • *(pile+pos) = entier;
  • pos++;
  • }
  • // Fonction de dépilage des valeurs
  • int Depiler()
  • {
  • pos--;
  • return *(pile+pos);
  • }
  • // Fonction d'affichage d'une valeur précise
  • int Select(int x)
  • {
  • if((x >= 0) && (x <= *pile))
  • return *(pile+x);
  • return -1;
  • }
  • // Fonction de vidage de la pile
  • void ViderPile()
  • {
  • int taille = *pile;
  • memset(pile, 0, taille);
  • pos = 1;
  • return;
  • }
  • int main()
  • {
  • int value;
  • size_t taille;
  • printf("Taille de la pile :\n");
  • scanf("%d", &taille);
  • InitPile(taille);
  • printf("Empiler :\n");
  • scanf("%d", &value);
  • Empiler(value);
  • printf("Depiler : %d\n", Depiler());
  • printf("Afficher une valeur :\n");
  • scanf("%d", &value);
  • printf("%d\n", Select(value));
  • printf("Vider la pile :\n");
  • ViderPile();
  • //system("pause");
  • return 0;
  • }
#include <stdio.h>

int *pile;
int pos = 0; //position dans la pile

// Initialisation de la pile
int InitPile(size_t taille)
{
    pile = (int *)malloc(taille);
    *pile = taille;
    if(pile != NULL){ pos = 1; return 0; }
    return 1;
}

// Fonction d'empilage des entiers
void Empiler(int entier)
{
    *(pile+pos) = entier;
    pos++;
}

// Fonction de dépilage des valeurs
int Depiler()
{
    pos--;
    return *(pile+pos);
}

// Fonction d'affichage d'une valeur précise
int Select(int x)
{
    if((x >= 0) && (x <= *pile))
        return *(pile+x);
    return -1;
}

// Fonction de vidage de la pile
void ViderPile()
{
    int taille = *pile;
    memset(pile, 0, taille);
    pos = 1;
    return;
}

int main()
{
    int value;
    size_t taille;
    printf("Taille de la pile :\n");
    scanf("%d", &taille);
    InitPile(taille);
    printf("Empiler :\n");
    scanf("%d", &value);
    Empiler(value);
    printf("Depiler : %d\n", Depiler());
    printf("Afficher une valeur :\n");
    scanf("%d", &value);
    printf("%d\n", Select(value));
    printf("Vider la pile :\n");
    ViderPile();
    //system("pause");
    return 0;
}

 Conclusion

Si l'allocation de la pile échoue, la fonction InitPile() renvoit 1 (gestion des erreurs).
L'utilisation de la pile est illustrée dans la fonction main().
Remarque : le premier élément de la pile (position 0) contient sa taille.


 Historique

17 juillet 2004 12:33:55 :
17 juillet 2004 12:36:49 :
17 juillet 2004 12:56:18 :
17 juillet 2004 14:08:18 :
17 juillet 2004 14:19:40 :

 Sources du même auteur

Source avec Zip Source avec une capture HASH MD5 D'UNE CHAINE OU D'UN FICHIER (DE TAILLE QUELCONQUES...
LES NOMBRES PREMIERS (CRIBLE D'ERATHOSTÈNE)
TRI D'ENTIER DANS L'ORDRE CROISSANT (TRISHELL)
CONVERSION BINAIRE <> DECIMALE EFFICACE
CONVERTION D'UNE CHAINE DE MJUSCULE EN MINUSCULE ET VICE VER...

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de BruNews le 17/07/2004 12:51:44 administrateur CS

Salut,

int Select(int x) , ton compilo ne rale pas quand tu ne retournes pas une valeur a tout coup ?

Commentaire de kod32 le 17/07/2004 12:55:42

mon compilo tire pas la gueulle non :) (dev-C++)
Mais c'est vrai que c'est pas le top. On peut rajouter un :
else return -1;
ça fait plus clean.

Merci

Commentaire de djl le 17/07/2004 13:39:35

le else n'est pas necessaire

if((x >= 0) && (x <= *pile))
        return *(pile+x);
return -1;

bien sur que devcpp (gcc)  gueule si tu active les warning (-Wall)

pense à utiliser un type unsigned ou size_t pour les tailles

Commentaire de BruNews le 17/07/2004 13:55:08 administrateur CS

djl t'as bien fait de rectifier, j'allais renvoyer sur ces commentaires quand un veut se faire une idee de devcpp. J' m'abstiendrais donc.

Commentaire de kod32 le 17/07/2004 14:05:28

je ne comprends pas l'utilité de size_t à la place de int, quelle différence entre les 2 ?

Commentaire de djl le 17/07/2004 14:13:27

BruNews >  "j'allais renvoyer sur ces commentaires quand un veut se faire une idee de devcpp. J' m'abstiendrais donc"

excuse moi mais j'ai pas trop compris :s

kod32 > size_t est non signé, avec int probleme  si la taille est superieur à 2^16 -1

Commentaire de AlexMAN le 17/07/2004 14:29:26

oula djl, 2^16 - 1 ?? Les int signés seraient limités a 65535 ? Non pas du tt, tu parles d'entier non signés de 16bits la (ou encore short sur nos machines) ! ca depend de l'implementation mais sur nos machines (32bits) la taille limite va de (a peu pres) -2 000 000 000 a 2 000 000 000  ! size_t etant defini come un unsigned long, il va juska 2^32-1 !

Commentaire de djl le 17/07/2004 14:35:00

ouai 2^31-1  j'ai pas fait gaffe
j'ai toujours imaginé que c'etait ca

enfin size_t reste quand meme independant de la machine contrairement à int

Commentaire de BruNews le 17/07/2004 14:40:04 administrateur CS

ben oui djl, si compilo ne ralait pas quand pas de valeur retournee alors que fonction DOIT retourner int ...
Mais bon, tu nous as dit que ce n'est pas le cas, donc devcpp OK sur ce point.

Commentaire de djl le 17/07/2004 14:44:47

ok, en fait gcc est meme connu pour son grand respect du standard

par exemple il te permet de savoir si ta source est totalement compatible c  ansi avec les options
-ansi -pedandic -Wtraditional

tu peux mem aller plus loin pour les warning
-Werror -Wmissing-prototypes -Wstrict-prototypes ...

Commentaire de BlackGoddess le 17/07/2004 14:53:53

quels sont les avantages et les inconvenients d'une implémentation par tableau dynamique et d'une implémentation par liste chaînée ?

Commentaire de djl le 17/07/2004 15:02:51

en terme de performance avec un tableau c'est mieux, vu qu'avec une liste il ya alllocation / desallocation à chaque empillage / desempillage

Commentaire de BlackGoddess le 17/07/2004 15:34:19

donc performance au niveau rapidité ?

par contre au niveau utilisation mémoire les listes chaînées sont peut-etre plus performantes ? plus souples aussi? (que se passe-t-il si on dépasse la taille du tableau ?)

Commentaire de djl le 17/07/2004 15:39:26

avec un tableau il faut ccontroller les bord et reallouer si necessaire, mais c'est beaucoup moins frequent que pour  une liste

pour ce qui est de l'utilisation de la memoire, avec une liste d'entiers c'est pas terrible non plus car il faut au moins stocker pour chaque entier l'adresse de son precedent, 4 octets de plus

une liste de 8000 entier, ca prend autant de place qu'un tableau de 16000 entier

Commentaire de AlexMAN le 17/07/2004 15:42:51

je pense mm ke les listes chainés utilisent plus de memioire qu'un simple tableau : liste chainées contiennent une donnée supplémentaire par rapport au tableau, un pointeur sur la structure suivante !

Si tu depasses la taille d'un tableau, risk d'ecrire ds la pile sur des données => plantage...

Commentaire de AlexMAN le 17/07/2004 15:45:19

un avantage des listes chainées, c ke lorsk que tu veux supprimer un maillon, tu n'es pas obligé de reparcourir les données suivantes et de les replacer sur index - 1...C'est le seul avantage que jy trouve

Commentaire de djl le 17/07/2004 15:48:27

oui, enfin la on parle d'une pile, donc on aura jamais à faire ca

Commentaire de alcatrazzz le 18/11/2005 21:29:48

bonsoir les ami(e)s, je suis débutant dans le domaine, par contre j'ai un problème avec la"PILE d'entier", je n'arrive pas à compilé????? HELP ME PLEASE....
1 initialiser
2 Empiler
3 Dépiler
4 Afficher
5 Quitter

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,281 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales