栈C语言实现

栈C语言实现

栈的基本特性

具有后进先出的特性(Last In First Out=LIFO) 或
具有先进后出的特性(First In Last Out=FILO)
例如:放书和取书,弹匣
栈的操作只能操作栈顶!
入栈又称压栈
出栈又称弹栈

#include <stdio.h>
#include <stdlib.h> //为了用malloc函数
/*声明描述栈属性信息的结构体*/
typedef struct stack {
    int *arr; //数组的首地址
    int cap; //栈的容量大小
    int top; //栈顶
}stack_t;
/*定义栈相关的操作函数*/
//1.给栈分配内存,让arr指向分配的内存的首地址
//并且把栈初始化为空栈(没有数据)
void stack_init(stack_t *stack, int cap)
{
    //分配内存,让arr指向分配的内存
    stack->arr = (int *)malloc(cap * sizeof(int));
    stack->cap = cap; //指定栈容量
    stack->top = 0; //空栈
}
//2.释放内存并且恢复到初始化状态
void stack_deinit(stack_t *stack) 
{
    free(stack->arr);
    stack->cap = 0;
    stack->top = 0;
}
//3.判断是否满
int stack_full(stack_t *stack)
{
    //栈顶top大于等于容量cap,就是满
    return stack->top >= stack->cap; //满返回1,不满返回0
}
//4.判断是否空
int stack_empty(stack_t *stack)
{
    return !stack->top; //空(top=0)返回1,不空返回0 
}
//5.入栈(压栈),向分配的内存中保存数据
//data:就是要保存的数据
void stack_push(stack_t *stack, int data)
{
    stack->arr[stack->top++] = data;
}
//6.出栈(弹栈),从栈中取出数据
int stack_pop(stack_t *stack)
{
    return stack->arr[--stack->top];
}
//7.仅仅获取栈顶元素(最上面的一个数字)
int stack_top(stack_t *stack)
{
    return stack->arr[stack->top-1];
}
//8.获取栈中目前保存数据的个数
int stack_size(stack_t *stack)
{
    return stack->top;
}
//测试主函数
int main(int argc, char *argv[])
{
    //1.定义栈
    stack_t stack; 

    //2.初始化栈,给栈分配存储数据的内存空间并且指定容量
    stack_init(&stack, 10);

    //3.判断空和满
    int ret = 0;
    ret = stack_full(&stack);
    printf("%s\n", ret ? "满":"不满");
    ret = stack_empty(&stack);
    printf("%s\n", ret ? "空":"不空");
   
    //4.压栈
    int i = 250;
    while(!stack_full(&stack)) {
        stack_push(&stack, i++);
    }
    ret = stack_full(&stack);
    printf("%s\n", ret ? "满":"不满");
    printf("栈顶的值是%d\n", stack_top(&stack));
    printf("栈的大小是%d\n", stack_size(&stack));

    //5.出栈
    while(!stack_empty(&stack)) {
        printf("%d ", stack_pop(&stack));
    }
    printf("\n");
    ret = stack_empty(&stack);
    printf("%s\n", ret ? "空":"不空");
    
    //6.释放内存
    stack_deinit(&stack);
    return 0;
}













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值