热门IT资讯网

数据结构之栈c语言实现

发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,栈是一种先进后出的数据结构,计算机中常见的函数调用就用到了这种结构,其常用的操作就是出栈、入栈,如下图,数据总是从栈顶入,从栈顶出:接下来看一个简单的程序将按"abcdef"入栈,并打印其出栈顺序:#

栈是一种先进后出的数据结构,计算机中常见的函数调用就用到了这种结构,其常用的操作就是出栈、入栈,如下图,数据总是从栈顶入,从栈顶出:

接下来看一个简单的程序将按"abcdef"入栈,并打印其出栈顺序:

#include #include #include #define STACK_SIZE        16#define NAME_MAX_SIZE     32#define ERR                  -1#define SUCC                 0typedef struct stack {        char *array;       /* 栈的起始地址 */        int stack_size;    /* 栈大小 */        int top;   /* 栈顶所在的位置 */        char(*pop)(struct stack *sta);        /* 出栈 */        int (*push)(struct stack *sta, char data); /* 入栈 */} stack_t;static int is_empty(stack_t *sta){        return (sta->top == -1);}static int is_full(stack_t *sta){        return (sta->top == sta->stack_size-1);}/* 将栈顶元素出栈,并返回 */char pop_stack(stack_t *sta){        char ch;        if (is_empty(sta)) {                printf("the stack is empty \n");                return ERR;        }        ch = sta->array[sta->top];        --sta->top;        return ch;}/* 在栈顶插入元素 */int push_stack(stack_t *sta, char data){        if (is_full(sta)) {                printf("the stack is full \n");                return ERR;        }        ++sta->top;        sta->array[sta->top] = data;        return SUCC;}void init_stack(stack_t **sta){        *sta = (stack_t *)malloc(sizeof(stack_t));        if ((*sta) == NULL) {                printf("no mem \n");                return ;        }        (*sta)->top        = -1;        (*sta)->stack_size = STACK_SIZE;        (*sta)->pop        = pop_stack;        (*sta)->push       = push_stack;         (*sta)->array = (char *)malloc(STACK_SIZE);        if ((*sta)->array == NULL) {                printf("no mem \n");                return ;        }}int main(int argc, char *argv[]){        int size, ret, i;        stack_t *sta_addr;        char data[] = "abcdef";                init_stack(&sta_addr);        size = sizeof(data) / sizeof(data[0]);        for (i = 0; i < size; i++) {                sta_addr->push(sta_addr, data[i]);        }                while (1) {                 ret = sta_addr->pop(sta_addr);                 if (ret != ERR) {                        printf("%c,", ret);                 } else {                        break;                 }        }        return 0;}


0