/*
* 栈演示(栈的几个函数)
* */
#include "text3.h" //多文件的时候需要将所有的函数声明都放在头文件里面,
//结构体如果是公用的话也要写在头文件里面
//栈的初始化函数
//这个函数可以使一个不能用的栈可以用相当于初始化
//通常将这个函数写在最前面
void stack_init(stack *p_stack) {
p_stack->num = 0;//初始化栈内个数
}
//栈清理函数,清理的是已经用过的栈
//栈不用了进行清空,只是将下标归零
void stack_deinit(stack *p_stack) {
p_stack->num = 0;
}
//获得栈里数字
//将当前位置的数据返回就可以
int stack_size(const stack *p_stack) {//
return p_stack->num;//返回num的值
}
//判断栈是不是放满了
//满了话下标从最后一个有效地址变为后一个,也就是SIZE,这是越界的下标
int stack_full(const stack *p_stack) {
return p_stack->num >= SIZE;//如果栈满了,大于SIZE
}
//判断是不是空的函数
//空的说明这个时候的num是0
int stack_empty(const stack *p_stack) {
return !(p_stack->num);//如果是空的返回1
}
//向栈里加入数字
//这两个参数是数组所在结构体的地址和要放的数,都是形参,将要加入的数赋值给此时对应的下标的数组就可以了,在赋值之后下标会指向下一个位置
int stack_push(stack *p_stack, int num) {//因为有可能加入不进去,所以可以用返回值来判断
if(stack_full(p_stack)) {
return 0;
}
else {
p_stack->arr[p_stack->num] = num;
p_stack->num++; //这里位置不能交换,在赋值后再加1
return 1;
}
}
//从栈里获得数字的函数(获取后从栈里删除) //这里说的获取后会删除的意思是当前指的这个位置之前已经取过了,当下次进行取值的时候会将下标减1指向上一个,把当前这个就跳过去也就是不再数组所存数据范围里了
int stack_pop(stack *p_stack, int *p_num) {//这里获得数字后直接就放在指针所指的存储区里面了
if(stack_empty(p_stack)) {//判断如果栈不是空的才进行取值
return 0;
}
else{
p_stack->num--; //在没有进行这一步的时候,下标所对应的是一个不是有效值的存储区,也就是在栈里面每存一个数之后,指针指的是所存数据的下一个
*p_num = p_stack->arr[p_stack->num];//当下标减1指向数据的时候将值赋值给要给的存储区即可
return 1;
}
}
//从栈里获得数字(获得后不会删除)
int stack_top(const stack *p_stack,int *p_num) {
if(stack_empty(p_stack)) {
return 0;
}
else{
*p_num = p_stack->arr[p_stack->num-1];//这里的num不会变,因为const
return 1;
}
}
【C语言】栈演示(栈的几个函数)
最新推荐文章于 2024-07-27 21:27:02 发布