已經有編好的通用型別的類似堆疊程式,分別是Piles.h和Piles.c,這裡列出標頭檔案,主要是瞭解呼叫方法:
#ifndef PILE_H
#define PILE_H
#include <stdbool.h>
typedef struct _pile *Pile;
typedef enum {
  PILE_PAS_D_EXCEPTION,
  PILE_VIDE,
  PILE_IMPOSSIBLE_D_ALLOUER_MEMOIRE
} ExceptionPile;
// ————————————–
// constructeur :
// retourne une pile vide.
// exception :
//   PILE_IMPOSSIBLE_D_ALLOUER_MEMOIRE, l`allocation n`a pas fonctionner.
Pile creerPile( ExceptionPile * );
// ————–
// manipulateur :
// ajouter un element sur le sommet de la pile.
// exception :
//   PILE_IMPOSSIBLE_D_ALLOUER_MEMOIRE, l`allocation n`a pas fonctionner.
void empiler( Pile, void *element, ExceptionPile * );
// enleve le sommet de la pile.
// exception :
//   PILE_VIDE, depiler a ete appele sur une pile vide.
void  depiler( Pile, ExceptionPile * );
// ————-
// observateur :
// lire le sommet de la pile.
// exception :
//   PILE_VIDE, sommet a ete appeler sur une pile vide.
void *sommet( Pile, ExceptionPile * );
// retourne true si la pile est vide.
bool estVide( Pile );
#ifdef TESTS_UNITAIRES
// routine effectuant les tests unitaires.
// cette routine terminre normalement si les tests
// unitaires detectent une erreurs.
// sinon cette routine termine anormalement affichant
// l`erreur trouvee (assert).
void testerPiles();
#endif
#endif
 
 
另外我建立了一結構資料Point,表示一座標軸上的點。
結構資料定義如下:
/*point.h*/
#ifndef _POINT_H
#define _POINT_H
//structure point pour presenter un point
typedef struct point{
  float x;
  float y;
} Point;
#endif
 
另外一主程式main.c用來測試堆疊程式:
#include <stdio.h>
#include <stdlib.h>
#include “point.h”
#include “Piles.h”
int main(int argc, char * argv[])
{
 
  Pile p_nouveau;
  ExceptionPile exp = 0;
  int i,j;
  int *element;
  Point *p1 = malloc(sizeof *p1);
 
  if (argc == 1)
  {
   
   
    for(i = 0; i < 4; i++){
     
      element = (int*)i;
      printf(“Empiler l`element : %d
“, element);
      empiler(p_nouveau, element, &exp);
     
     }
    
    for(i = 0; i < 4; i++ )
    {
      element = sommet(p_nouveau, &exp);
      printf(“Depiler l`element est : %d
“, element);
      depiler(p_nouveau, &exp);    }
    
    for(i = 0; i < 4; i++){
     
      p1->x = (float)i;
      p1->y = (float)i;
      printf(“Empiler le point (%f, %f)
“, p1->x, p1->y);
      empiler(p_nouveau, p1, &exp);
     
     }
    
      for(i = 0; i < 4; i++ )
    {
      p1 = sommet(p_nouveau, &exp);
      printf(“Depiler le point (%f, %f)
“, p1->x, p1->y);
      depiler(p_nouveau, &exp);
     
    }
    
    
   }
 
  return 0;
}
 
在linux下gcc編譯通過,執行結果如下:
Empiler l`element : 0
Empiler l`element : 1
Empiler l`element : 2
Empiler l`element : 3
Depiler l`element est : 3
Depiler l`element est : 2
Depiler l`element est : 1
Depiler l`element est : 0
Empiler le point (0.000000, 0.000000)
Empiler le point (1.000000, 1.000000)
Empiler le point (2.000000, 2.000000)
Empiler le point (3.000000, 3.000000)
Depiler le point (3.000000, 3.000000)
Depiler le point (3.000000, 3.000000)
Depiler le point (3.000000, 3.000000)
Depiler le point (3.000000, 3.000000)
 
問題:
在對整數進行堆疊執行時,測試正確,但對結構資料point進行出棧執行時,總是顯示最後進棧的資料,不知道問題出在什麼地方,希望大家能幫忙解決一下,不甚感激!
另外很多名詞是法語的,希望大家不要介意:
pile:也就是stack的意思
empiler:相當於push的意思
depiler:相當於pop的意思
element:相當於dada的意思
sommet: 相當於堆疊頂點的意思