読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

stack

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

typedef union {
    int i;
    char c;
    float f;
} _stack_value_t;

typedef struct {
    _stack_value_t *value;
    int i;
    size_t size;
} _stack_t;

_stack_t *make__stack(size_t size) {
    _stack_t *_stack = (_stack_t *)malloc(sizeof(_stack_t));
    _stack_value_t *vp = (_stack_value_t *)malloc(sizeof(_stack_value_t) * size);
    _stack->value = vp;
    _stack->size = size;
    _stack->i = -1;
    return _stack;
}

int push(_stack_t *_stack, _stack_value_t value) {
    _stack_value_t *t;
    int size = _stack->i*2;
    if (_stack->size < size) {
        if (size <= 0)
            size = 1;
        if ((t = (_stack_value_t *)realloc(_stack->value, size)) != NULL)
            _stack->size = size;
        else
            return 1;
    }
    _stack->value[++_stack->i] = value;
    return 0;
}

int is_empty(_stack_t *_stack) {
    return _stack->i < 0;
}

_stack_value_t pop(_stack_t *_stack) {
    return _stack->value[_stack->i--];
}

void _stack_destroy(_stack_t *_stack) {
    free(_stack->value);
    free(_stack);
}

int main(int argc, char *argv[]) {
    _stack_t *_stack = make__stack(1);
    _stack_value_t value;
    value.i = 100;
    push(_stack, value);
    push(_stack, value);
    push(_stack, value);
    push(_stack, value);
    while (!is_empty(_stack))
        printf("%d\n", pop(_stack).i);
    _stack_destroy(_stack);
    return 0;
}