C言語にはないデータ構造
キューの実装と同様にここでもC言語では実装されていないデータ構造を再現していきます。
スタックとは
スタックは先入れ後出し(LIFO:Last In First Out)のデータ構造です。
下から上にデータを積み上げていき、上から取り出していくイメージです。
データの挿入を行うPUSHとデータを取り出すPOPという操作があります。
具体的に例を見ていきましょう。
| 2 |
| 8 |
| 4 |
下から順に4,8,2とデータが格納されています。
ここに3をPUSHすると以下のようになります。
| 3 |
| 2 |
| 8 |
| 4 |
これにPOPをすると3が取り出されスタックは以下のようになります。
| 2 |
| 8 |
| 4 |
スタックの実装
stack_samlpe1.c
#include <stdio.h>
#define MAX_DATA 32
struct stack
{
int arr[MAX_DATA];
int top; //末尾のデータのある配列の要素番号
};
int push(struct stack *stk, int input)
{
if (stk->top <= MAX_DATA)
{
stk->top++;
stk->arr[stk->top] = input;
return 0;
}
else
{
printf("データを追加できません。\n");
return -1;
}
}
int pop(struct stack *stk)
{
if (stk->top != 0)
{
int temp = stk->top;
stk->top--;
return stk->arr[temp];
}
else
{
printf("データがありません。\n");
return -1;
}
}
void init_stack(struct stack *stk)
{
int i;
for (i = 0; i < MAX_DATA; i++)
stk->arr[i] = 0;
stk->top = 0;
}
void show_stack(struct stack *stk)
{
int i;
for (i = 0; i < MAX_DATA; i++)
printf("%d ", stk->arr[i]);
printf("\ntop:%d\n\n", stk->top);
}
int main(void)
{
int i;
int d;
struct stack stk;
init_stack(&stk);
for (i = 1; i <10; i++)
{
push(&stk, i * 3);
show_stack(&stk);
}
d = pop(&stk);
printf("\n%d\n", d);
show_stack(&stk);
return 0;
}
上から順に構造体stack、関数push()、関数pop()、関数init_stack()、関数show_stack()、main()関数の定義となっています。
構造体stackはデータを格納する配列arr[]と、末尾を表す変数topを持っています。
関数push()、pop()はそれぞれPUSH、POPの操作を実装しています。
関数init_stack()で構造体stackを初期化し、show_stack()で構造体stackの中身を表示しています。
これらの関数をmain()関数で使用しています。
キューのソースコードもそうですがint型で0はデータがない状態を表しています。
char型のプログラムに改変するのも良いでしょう。