C言語 スタックの実装と使い方【サンプルコード付き】

C言語では、スタック(stack)を使用して、データをLIFO(Last-In First-Out)形式で保存およびアクセスすることができます。スタックは通常、関数呼び出しの引数、ローカル変数、および戻りアドレスなどを保存するために使用されます。

C言語では、配列とポインタを使用してスタックの基本操作を実装することができます。以下はシンプルなスタックの実装例です。

#include <stdio.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void init(Stack *stack) {
    stack->top = -1;
}

void push(Stack *stack, int value) {
    if (stack->top == MAX_SIZE - 1) {
        printf("Stack is full\n");
        return;
    }
    stack->data[++stack->top] = value;
}

int pop(Stack *stack) {
    if (stack->top == -1) {
        printf("Stack is empty\n");
        return -1;
    }
    return stack->data[stack->top--];
}

int main() {
    Stack stack;
    init(&stack);

    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);

    printf("Popped value: %d\n", pop(&stack));
    printf("Popped value: %d\n", pop(&stack));
    printf("Popped value: %d\n", pop(&stack));
    printf("Popped value: %d\n", pop(&stack));

    return 0;
}

上記の例では、整数配列dataと整数変数topを含むStack構造体が定義されており、これはスタックのトップの位置を表しています。また、スタックの初期化(init)、プッシュ(push)、ポップ(pop)などの操作関数が定義されています。

main関数で、スタックオブジェクトstackを作成し、プッシュとポップ操作を行い、最後にポップされた値を出力します。

実際には、スタックはスタックオーバーフローまたはスタックが空の場合の例外を防止するためにエラーハンドリングが必要となる可能性があります。

bannerAds