2.数据结构之栈

数据结构之栈(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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值