头文件
#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;
}