栈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;
}