[C言語]構造体でスタックを簡単に実装してみた[コード付き]

C言語コード

今回はスタックです。
いつもと違ったリストのようなものですね。

この記事でのスタックは構造体を用いてtopの位置を記録するものとなってます。
全体のコードはこの記事の下に貼って置くので参考にどうぞ。



スタックとは?

データを格納するリストのようなものなんですが、
イメージは下から上に積み上げていく形です。

それが普通とどのように違うかというと、

一番上の要素しか操作できない

ということです
図を使って説明します

このように平地に積まれた石のような感じです。
もちろん下の石を取り出そうとすると、この積み上げた石が崩れてしまうのでできません。
なので一番上の石だけが操作できるというイメージです。

一番上の要素を取り上げることをpop

一番上に要素を積むことをpushといいます。



コードの実装

やっていきましょう。
いつもどおり構造体の定義から関数の順でやっていきます





構造体の定義

スタックが普通の配列と違う点は常にtopの位置情報を持つことです。
つまり普通の配列+int型のデータセットで良いですね。

typedef struct stack{
    int date[max];
    int top;
}stack;


注意する点は

構造体自体を配列にするのではなく、
一つの構造体の中に配列型のデータを持つ


ということです。
そうすることで一つのint型を一つの配列で共有することが実現できました。



push関数

スタックに数値を積み上げるpush関数を作ります。

void push(stack *p){
    int v;
    
    if(p->top >= max-1){
        printf("これ以上積めません\n");
    }else{
        printf("pushする値を入力してください:");
        scanf("%d",&v);
        
        p->top++;
        p->date[p->top] = v;
    }
}


とりあえず仮引数のスタックの構造体はポインタで渡します。
中身のデータを変えますからね。

おさらいですが、topは現在入っている一番新しい数値の添字です。

まずif文でこれ以上積めるか確認します。
上のコードの場合maxはマクロで定義した最大値です。

可能ならまずtopをインクリメントして、そこに新しい値を代入します。



pop関数

スタックから数値を取り上げるpop関数です

void pop(stack *p){
    if(p->top <= -1)
        printf("これ以上取り出せません");
    else{
        p->date[p->top] = 0;
        p->top--;
    }
}

topが-1(つまり何も積まれていない状態)なら何もしません。

そうでないならまず現在のtopの場所を0に、
その後topをデクリメントします。



show関数

スタックの現在の中身を表示する関数です。

void show(stack *p){
    printf("stack:");
    for(int i=p->top; i >= 0; i--)
        printf("%3d",p->date[i]);
    
    printf("\n\n");
}

これも仮引数はポインタで渡して
for文はtopから0に向かう方向で表示していきましょう。



全体のコードと動作確認

全体のコードです。

#include <stdio.h>
#include <stdlib.h>

#define max 5

typedef struct stack{
    int date[max];
    int top;
}stack;

void init(stack *p){
    p->top = -1;
    for(int i=0; i<max; i++)
        p->date[i] = 0;
}

void push(stack *p){
    int v;
    
    if(p->top >= max-1){
        printf("これ以上積めません\n");
    }else{
        printf("pushする値を入力してください:");
        scanf("%d",&v);
        
        p->top++;
        p->date[p->top] = v;
    }
}

void pop(stack *p){
    if(p->top <= -1)
        printf("これ以上取り出せません\n");
    else{
        p->date[p->top] = 0;
        p->top--;
    }
}

void show(stack *p){
    printf("stack:");
    for(int i=p->top; i >= 0; i--)
        printf("%3d",p->date[i]);
    
    printf("\n\n");
}

int main(int argc, const char * argv[]) {
    int sw;
    
    stack S;
    init(&S);
    
    while(1){
        printf("何を行いますか?\n");
        printf("0:push 1:pop 2:exit\n:");
        scanf("%d",&sw);
        switch(sw){
            case 0: push(&S); show(&S); break;
                
            case 1: pop(&S); show(&S); break;
                
            case 2: exit(0); break;
        }
        
    }
}

main関数ではwhile文で基本的に無限ループです。
exit関数はプログラムを終了する関数で、stdlib.hをインクルードする必要があります。

実際に動かすと

おk

てことで今回はここまで。

ではまた

コメント

タイトルとURLをコピーしました