[C言語]ものすごく原始的なスタック(pop&push)を自作してみた

K&R(カーニハン・リッチー)に、スタックを実現するサンプルコードが載っていました。 でもこれだけでは使い方が全然わかりません。
というわけで、これを利用してもうちょっと実用的なコードを書いてみました。
#include <stdio.h>
#include <string.h>

/* ここから、K&Rに載っていたサンプルコード */

#define BUFFER_SIZE 10000
static char allocbuf[BUFFER_SIZE];
static char *curp = allocbuf;
char *alloc(int);
void afree(char *);

char *alloc(int n)
{
    if (curp + n >  allocbuf + BUFFER_SIZE) {
        return NULL;
    }

    char *oldp = curp;
    curp += n;
    return oldp;
}

void afree(char *p)
{
    if (allocbuf <= p && p < allocbuf + BUFFER_SIZE ) {
        curp = p;
    }
}

/* ここまでが、K&Rに載っていたサンプルコード */

/* ここから下が、それを利用するstackの実装 */

static char *plist[10];
static int cur_index = 0;

int push(char *p)
{
    char *lp = alloc(strlen(p) + 1);
    plist[cur_index++] = lp;
    strcpy(lp, p);
    printf("[push] %s\n", lp);
    return 1;
}

char *pop()
{
    afree(plist[--cur_index]);
    printf("[pop ] %s\n", plist[cur_index]);
    return plist[cur_index];
}

int main()
{
    push("a");
    push("bc");
    push("def");

    pop();
    pop();
    pop();

    return 0;
}
実行結果
[push] a
[push] bc
[push] def
[pop ] def
[pop ] bc
[pop ] a
popを連続して呼び出すと、pushしたときと逆の順番でスタックからデータが取り除かれている様子がわかります。
カテゴリ:

人気記事