基于数组的堆栈实现

来源:互联网 发布:七天网络查分登入账号 编辑:程序博客网 时间:2024/04/29 14:33

定义函数接口头文件“sa.h”

#ifndef _SA_H#define _SA_H#include <sys/types.h>/* 堆栈 */typedef struct Stack {    int*   arr; /* 数组 */    size_t cap; /* 容量 */    size_t top; /* 栈顶 */}   STACK;/* 分配内存并初始化为空堆栈 */void stack_init (STACK* stack, size_t cap);/* 释放内存并恢复到初始状态 */void stack_deinit (STACK* stack);/* 判断是否满 */int stack_full (STACK* stack);/* 判断是否空 */int stack_empty (STACK* stack);/* 压入 */void stack_push (STACK* stack, int data);/* 弹出 */int stack_pop (STACK* stack);/* 栈顶 */int stack_top (STACK* stack);/* 数量 */size_t stack_size (STACK* stack);#endif /* _SA_H */

函数功能实现“sa.c”

/* 基于数组的堆栈 */#include <stdlib.h>#include "sa.h"/* 分配内存并初始化为空堆栈 */void stack_init (STACK* stack, size_t cap) {    stack->arr = malloc (cap * sizeof (int));    stack->cap = cap;    stack->top = 0;}/* 释放内存并恢复到初始状态 */void stack_deinit (STACK* stack) {    free (stack->arr);    stack->arr = NULL;    stack->cap = 0;    stack->top = 0;}/* 判断是否满 */int stack_full (STACK* stack) {    return stack->top >= stack->cap;}/* 判断是否空 */int stack_empty (STACK* stack) {    return ! stack->top;}/* 压入 */void stack_push (STACK* stack, int data) {    stack->arr[stack->top++] = data;}/* 弹出 */int stack_pop (STACK* stack) {    return stack->arr[--stack->top];}/* 栈顶 */int stack_top (STACK* stack) {    return stack->arr[stack->top - 1];}/* 数量 */size_t stack_size (STACK* stack) {    return stack->top;}

测试用例“sa_test.c”

/* 基于数组的堆栈 */#include <stdio.h>#include "sa.h"/* 测试用例 */int main (void) {    STACK stack;    stack_init (&stack, 10);    int i = 0;    while (! stack_full (&stack))        stack_push (&stack, i++);    while (! stack_empty (&stack))        printf ("%d\n", stack_pop (&stack));    stack_deinit (&stack);    stack_init (&stack, 5);    stack_push (&stack, (int)"ABC");    stack_push (&stack, (int)"DEF");    stack_push (&stack, (int)"GHI");    stack_push (&stack, (int)"JKL");    stack_push (&stack, (int)"MNO");    while (! stack_empty (&stack))        printf ("%s\n", (char const*)stack_pop (&stack));    stack_deinit (&stack);    return 0;}

0 0