数据结构②——栈

2020-01-05  本文已影响0人  besmallw

栈定义

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(转自百度百科)

这里我的做法是:初始化的时候先分配一段栈空间,当空间不足时,再重新分配空间
top是指向栈顶元素的下一个(比如初始的栈顶top = 0,当插入一个元素后,插入的元素放在 0 处,然后top = 1,1 这个地方是没有实际元素的)

1.栈的数据结构

#define ALLOC_SIZE   512  // 初始的栈空间
typedef int KEY_TYPE;  // 需要存的数据的数据类型。这里可以更改为自定义的结构体

typedef struct _stack {
    KEY_TYPE *base;  // 初始的栈空间    
    int top;         // 栈顶
    int stack_size;  // 当前栈空间大小
} stack;

2.栈的初始化

包括分配空间,栈顶指向0,栈大小为ALLOC_SIZE

void init_stack(stack *s) {
    s->base = (KEY_TYPE*)calloc(ALLOC_SIZE, sizeof(KEY_TYPE)); // 分配空间
    assert(s->base);

    s->top = 0;
    s->stack_size = ALLOC_SIZE;
}

3.入栈

先对栈s检查。然后判断栈空间是否满了。如果是满的,先重新分配空间,再插入元素

void push_stack(stack *s, KEY_TYPE data) {
    assert(s);
    if (s->top >= s->stack_size) { // 空间不足,重新分配空间
        s->base = (KEY_TYPE*)realloc(s->base, (s->stack_size + ALLOC_SIZE) * sizeof(KEY_TYPE));
        assert(s->base);

        s->stack_size += ALLOC_SIZE;
    }
    s->base[s->top] = data; // 插入数据到栈顶
    s->top++;  // top指向下一个
}

4.出栈

void pop_stack(stack *s, KEY_TYPE *data) { // 取出栈顶元素
    assert(s);
    *data = s->base[--s->top]; // 这里相当于  s->top--;  *data = s->base[s->top];
}

5.销毁栈

void destory_stack(stack *s) { // 销毁栈
    assert(s);

    free(s->base);
    s->base = NULL;
    s->stack_size = 0;
    s->top = 0;
}

2020.1.5 22:23 广州

上一篇下一篇

猜你喜欢

热点阅读