您的位置:首页 > 其它

基于数组的堆栈实现

2014-04-22 13:00 363 查看
定义函数接口头文件“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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: