別名「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;
}