数据结构之栈(stack)
特点:具有先进后出或者后进先出特性
例如:放书取书,鸡尾酒,函数调用
只操作一端,这一端又称栈顶
入栈:将数据保存到栈的内存空间的过程,又称压栈,push stack
出栈:从栈的内存中取出数据的过程,又称弹栈,pop stack
参考代码:stack目录
包含公共头文件
#include
宏定义
#define TRUE 1
类型定义 (可自定义数据类型)
typedef int BOOL
函数声明
int ConnectSever(const char* URL)
外部函数声明
extern const char* g_dns;
vim stack.h
//stack.h:栈的声明
#ifndef __STACK_H
#define __STACK_H
//包含公共的头文件
#include <stdio.h>
#include <stdlib.h>
//声明描述栈的信息的结构体数据类型
typedef struct stack {
int *arr; //保存栈的内存首地址
int cap; //保存栈的最大容量
int top; //保存栈的栈顶位置
}stack_t;
//声明栈的操作函数
extern void stack_init(stack_t *stack, int cap); //初始化栈
extern void stack_deinit(stack_t *stack);//释放栈的内存
extern int stack_full(stack_t *stack);//判断是否满
extern int stack_empty(stack_t *stack);//判断是否空
extern void stack_push(stack_t *stack, int data);//压栈
extern int stack_pop(stack_t *stack);//出栈
extern int stack_size(stack_t *stack);//获取栈中目前存储的有效数据个数
#endif
vim stack.c
//stack.c:栈的定义
#include "stack.h"
//定义栈的初始化函数
void stack_init(stack_t *stack, int cap) {
//1.给栈分配内存
stack->arr = (int *)malloc(sizeof(int)*cap);
//2.初始化容量
stack->cap = cap;
//3.初始化栈顶
stack->top = 0;
}
//定义释放栈内存函数
void stack_deinit(stack_t *stack) {
//1.释放内存
free(stack->arr);
//2.一切归0
stack->cap = 0;
stack->top = 0;
}
//定义判断满和空的函数
int stack_full(stack_t *stack) {
return stack->top >= stack->cap;//满返回1否则返回0
}
int stack_empty(stack_t *stack) {
return !stack->top;//空返回1否则返回0
}
//定义压栈函数
void stack_push(stack_t *stack, int data) {
stack->arr[stack->top++] = data;
}
//定义出栈函数
int stack_pop(stack_t *stack) {
return stack->arr[--stack->top];
}
//定义获取栈有效数据个数函数
int stack_size(stack_t *stack) {
return stack->top;
}
vim main.c
//main.c:测试
#include "stack.h"
int main(void) {
//1.定义栈变量
stack_t stack;
//2.初始化栈,最大容量为10个数据
stack_init(&stack, 10);
//3.压栈
int data = 520;
while(!stack_full(&stack)) //循环压栈10个数据
stack_push(&stack, data++);//520 521 ...
printf("有效个数是:%d\n", stack_size(&stack));
//4.出栈
while(!stack_empty(&stack))
printf("%d ", stack_pop(&stack));
printf("\n");
printf("有效个数是:%d\n", stack_size(&stack));
//5.释放内存
stack_deinit(&stack);
return 0;
}
vim Makefile
#Makefile
BIN=stack
OBJ=main.o stack.o
CC=gcc
$(BIN):$(OBJ)
$(CC) -o $(BIN) $(OBJ)
%.o:%.c
$(CC) -c -o $@ $<
clean:
rm $(BIN) $(OBJ)