一些栈的代码

头文件

#ifndef STACK_H
#define STACK_H

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define STACK_SIZE 10
typedef int datatype;

typedef struct stack_node
{
    datatype *data;
    int top;
} stack_node, *stack_ptr;

//创建栈
stack_ptr create_stack(void);

//判空
int stack_empty(stack_ptr S);

//判满
int stack_full(stack_ptr S);

//入栈
int stack_push(stack_ptr S, datatype data);

//出栈
datatype stack_pop(stack_ptr S);

//打印栈
void print_stack(stack_ptr S);

// 获取栈顶元素
datatype *get_top(stack_ptr S);

//销毁栈
void stack_destroy(stack_ptr S);

#endif

源文件

#include "stack.h"
// 创建栈
stack_ptr create_stack(void)
{
    // 在堆区申请空间
    stack_ptr S = (stack_ptr)malloc(sizeof(stack_node));
    if (NULL == S)
    {
        printf("分配失败\n");
        return NULL;
    }
    S->data = (datatype *)malloc(sizeof(datatype) * STACK_SIZE);
    if (NULL == S->data)
    {
        printf("分配失败\n");
        return NULL;
    }
    bzero(S->data, sizeof(datatype) * STACK_SIZE);
    S->top = -1;
    printf("创建成功\n");
    return S;
}

// 判空
int stack_empty(stack_ptr S)
{
    return S->top == -1;
}

// 判满
int stack_full(stack_ptr S)
{
    return S->top == STACK_SIZE - 1;
}

// 入栈
int stack_push(stack_ptr S, datatype data)
{
    if (NULL == S || stack_full(S))
    {
        printf("栈已满\n");
        return -1;
    }
    S->top++;
    S->data[S->top] = data;
    printf("%d入栈成功\n", data);
    return 0;
}
// 出栈
datatype stack_pop(stack_ptr S)
{
    if (NULL == S || stack_empty(S))
    {
        printf("栈为空\n");
        return -1;
    }
    // 出栈逻辑:先弹后减
    //printf("%d\t出栈成功\n", S->data[S->top]);
    datatype top =  S->data[S->top];
    S->top--;
    return  top;
}

// 打印栈
void print_stack(stack_ptr S)
{
    if (NULL == S || stack_empty(S))
    {
        printf("栈为空\n");
        return;
    }
    printf("从栈顶到栈底的元素分别是:\n");
    for (int i = S->top; i >= 0; i--)
    {
        printf("%d\t", S->data[i]);
    }
    putchar(10);
    return;
}

// 获取栈顶元素
datatype *get_top(stack_ptr S)
{
    if (NULL == S || stack_empty(S))
    {
        printf("栈为空\n");
        return;
    }
    return &S->data[S->top];
}

// 销毁栈
void stack_destroy(stack_ptr S)
{
    if (S != NULL)
    {
        free(S->data);
        S->data = NULL;
    }
    free(S);
    S = NULL;
}

主函数:

#include<myhead.h>
#include"stack.h"

int main(int argc, const char *argv[])
{
    //创建一个栈
    stack_ptr S = create_stack();
    if(NULL == S)
    {
        return -1;
    }

    //调用入栈函数
    stack_push(S, 5);
    stack_push(S, 2);
    stack_push(S, 9);
    stack_push(S, 6);

    //调用遍历函数
    print_stack(S);

    //调用出栈函数
    stack_pop(S);
    stack_pop(S);

    print_stack(S);

    printf("栈顶的元素是%d\n",*get_top(S));

    //调用销毁函数
    stack_destroy(S);
    S = NULL;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值