C言語アルゴリズム-スタック
スタック (stack)データ構造について
スタックとは、データを上に積み上げていき、最後に入力したデータが先に出力されるという特徴をもつデータ構造です。スタックにデータを挿入することを「push(積む)」といい、新しいデータが一番上に追加されます。スタックからデータを出すことを「pop(降ろす、取り出す)」といい、一番上にある新しいデータが優先して取得されます。このような「最後に入った物が最初に出てくる」というデータの入出力方式は「Last In, First Out (LIFO)」あるいは「First In, Last Out (FIFO)」と呼ばれます。
スタックの動作例
(push 1) stack : [ 1 ]
(push 2) stack : [ 1 2 ]
(pop) stack : [ 1 ] -> data : 2
(push 3) stack : [ 1 3 ]
(push 4) stack : [ 1 3 4 ]
(pop) stack : [ 1 3 ] -> data : 4
(pop) stack : [ 1 ] -> data : 3
(pop) stack : [ ] -> data : 1
C言語によるスタック実現プログラム
#include <stdio.h>
#define STACK_SIZE 10 /* スタックデータ数の最大値 */
/* スタックデータの定義 */
struct stack{
int num; /* スタックに存在する要素数 */
int data[STACK_SIZE]; /* 要素の格納先 */
};
typedef struct stack stack_t;
/*!
* @brief スタックにデータを挿入する
* @param[in/out] stk スタック
* @param[in] push_data 挿入するデータ
* @return 0 success
* @return -1 failure
*/
int
stack_push(stack_t *stk, int push_data)
{
/* スタックが満杯になっていないかチェックする */
if(stk->num >= STACK_SIZE) return(-1);
stk->data[stk->num] = push_data;
stk->num++;
return(0);
}
/*!
* @brief スタックからデータを取得する
* @param[in/out] stk スタック
* @param[out] pop_data 挿入するデータ
* @return 0 success
* @return -1 failure
*/
int
stack_pop(stack_t *stk, int *pop_data)
{
/* スタックが空でないかチェックする */
if(stk->num < 1) return(-1);
stk->num--;
*pop_data = stk->data[stk->num];
return(0);
}
/*!
* @brief スタック内にある要素を一覧表示する
* @param[in] stk スタック
*/
static void
stack_print(stack_t *stk)
{
int i;
printf("stack : [ ");
for(i = 0; i < stk->num; i++){
printf("%d ", stk->data[i]);
}
printf("]\n");
}
/*!
* @brief 初期化処理
*/
static void
stack_init(stack_t *stk)
{
/* スタックの要素数を初期化 */
stk->num = 0;
}
int
main(void)
{
stack_t stk = {0};
int data = 1;
/* スタックを初期化する */
stack_init(&stk);
/* スタックを満たすまで数値をpushする */
while(stack_push(&stk, data) == 0){
printf("(push %2d) ", data);
stack_print(&stk);
data++;
}
/* スタック内要素を全てpopする */
while(stack_pop(&stk, &data) == 0){
printf("(pop %2d) ", data);
stack_print(&stk);
}
return(0);
}
関連ページ
- C言語
- C言語アルゴリズム-スタック
- C言語アルゴリズム-待ち行列(キュー)
- C言語アルゴリズム-連結リスト
- C言語アルゴリズム-線形探索法
- C言語アルゴリズム-二分探索法
- C言語アルゴリズム-力まかせ探索
- C言語アルゴリズム-KMP法
- C言語アルゴリズム-BM法
- C言語アルゴリズム-ハッシュチェイン法
- C言語アルゴリズム-オープンアドレス法
- C言語アルゴリズム-二分探索木