栈实现

静态数组栈

const int N = 1e5 + 10;
int stk[N], n;

void push(int data) {
    stk[++n] = data;
}
void pop() {
    n--;
}
int top() {
    return stk[n];
}
bool empty() {
    return n == 0;
}
int size() {
    return n;
}

动态扩容栈

typedef int data_type;
typedef struct {
    // 本质是一个访问受限的动态顺序表
    data_type* pdata;
    int size;
    int capacity;
} stack;

static void check_capacity(stack* ptr) {
    assert(ptr);

    if (ptr->capacity == ptr->size) {
        int newcapacity = (ptr->capacity == 0) ? 4 : ptr->capacity * 2; // 每次增容两倍
        data_type* ptmp = (data_type*)realloc(ptr->pdata, newcapacity * sizeof(data_type));
        if (ptmp == NULL)
            exit(0);
        else {
            ptr->pdata = ptmp;
            ptr->capacity = newcapacity;
        }
    }
}

stack* init() {
    stack* ret = (stack*)malloc(sizeof(stack));
    if (ret == NULL)
        exit(0);

    ret->pdata = NULL;
    ret->size = 0;
    ret->capacity = 0;
    return ret;
}

void destory(stack* ptr) {
    assert(ptr && ptr->pdata);

    free(ptr->pdata);
    free(ptr);
}

void push(stack* ptr, data_type data) {
    check_capacity(ptr);

    ptr->pdata[++ptr->size] = data;
}

void pop(stack* ptr) {
    ptr->size--;
}

bool empty(stack* ptr) {
    return ptr->size == 0;
}

int size(stack* ptr) {
    return ptr->size;
}

int top(stack* ptr) {
    return ptr->pdata[ptr->size];
}
« 链表实现 ← 返回列表 队列实现 »