某ファブ施設スタッフの落書き

某ファブ施設で働くスタッフの気まぐれな日記のようなものです。

c言語でデータ構造 ~stack~

概要
基本的なデータ構造の一つ。LIFO(LastIn,FirstOut)後に格納されたデータから先に取り出される。
スタックポインタ(次に格納するデータ位置を保持している指標)と呼ばれる指標で操作する。

操作
・push
スタックポインタが指す位置にデータを格納する。
・pop
スタックポインタが指す位置のデータを取り出す。

実装

スタックのサイズ、スタックポインタを予めわかりやすいように定義しておく

#define STACK_SIZE 100         //スタック大きさを設定
#define SP (s->sp)             //スタックポインタの参照をSPとする

スタックの構造を定義

typedef struct{
    int strage[STACK_SIZE];    //stackのデータ格納領域
    int sp;                    //次に格納するデータ位置(初期値は0)
}STACK;

初期化用操作関数

//[機能]指定されたスタックを初期化する
//[引数]*s:初期化するスタック(ポインタ)           
void initStack(STACK *s)
{
    SP = 0;
    return;
}

データ格納用操作関数

//[機能]指定されたスタックにデータを格納する
//[引数]*s:格納対象となるスタック(ポインタ)
//      data:格納するデータ
//[返り値]正常終了:1 ,スタックオーバーフロー:0
int push(STACK *s,int data)
{
    if(SP < STACK_SIZE){
        s -> strage[SP] = data;
        SP++;
        return(1);
    }else{
        return(0);
    }
}

データ取り出し用操作関数

//[機能]指定されたスタックからデータを取り出す
//[引数]*s:取り出し対象となるスタック(ポインタ)
//      data:取り出したデータの格納先(ポインタ)
//[戻り値]正常終了:1 ,スタックアンダーフロー:0
int pop(STACK*s,int *data)
{
 
  if(SP>0){
    SP--;
    *data = s->strage[SP];
    s -> strage[SP] = NULL;
    return(1);
  }else{
    return(0);
  }
}