別名「Stack(スタック)」とも呼ばれ「FILO(First In Last Out)」方法を用いるデータ構造です。
FILOとは、最初に入れたデータが一番最後に取り出せる事を意味します。簡単に言うと
バケツに上から重ねていくように物を入れ、取り出すときは1番上から取り出します。
実際には、リスト構造を用いることにより簡単に実現できます。
 
PUSHを実装するには、リスト構造の先頭へデータを追加する事で可能となります。
/*
 * リストの先頭にNodeを追加
 */
void HeadInsert(LIST **Head, LIST *Node)
{
      /* データを追加 */
    Node->next = *Head;
    *Head = Node;
}
 
POPを実装するには、リスト構造の先頭データを取得し削除する事で可能となります。
/*
 * POPの一部抜粋
 */
    w=1;                            /* 先頭を指定 */
    p=GetNode(&head, w);
    if(p!=(LIST *)NULL){
        printf("POPしました %2d >> %d\n", w, p->data);
        DeleteNode(&head, w);
    }else{
        printf("POPするデータはありません");
    }
/*
 * リスト内のNodeを削除
 */
void DeleteNode(LIST **Head, int Position)
{
    LIST *p, *Node;
    Position--;                       /* 削除位置の一つ前にする */
    if(*Head != (LIST *)NULL){        /* LISTが存在しないなら終了 */
        if(Position==0){              /* 削除位置が先頭なら解放 */
            p=*Head;
            *Head = p->next;
            NodeFree(p);
              /* 削除位置がList内なら */
        }else if(GetNodeTotal(Head)>Position && Position>0){
            p=GetNode(Head, Position); /* 削除位置のNodeを取得 */
            Node = p->next;            /* Nodeを解放する */
            p->next = Node->next;
            NodeFree(Node);
        }
    }
}
/*
 * Nodeのデータを取得
 */
LIST *GetNode(LIST **Head, int n)
{
    int j=1;
    LIST *p;
    /* NULLが出るか、n番目のノードを取得するまでループ */
    for(p=*Head; p!=(LIST *)NULL; p=p->next){
        if(j==n)break;
        j++;
    }
    
    return p;
}