C语言-栈操作

栈主要是由一个数组和对应里面栈的个数所构成的

这里主要介绍栈的初始化,清零,判断是否为空 和 是否为满,进行数据的插入,进行数据的删除,进行数据的提取操作

01stack.h stack函数的声明文件

/*
栈演示
*/ 
#ifndef          __01STACK_H__ 
#define          __01STACK_H__ 
typedef struct {
    int buf[SIZE]; //SIZE宏表示数组里的元素个数,这样可以在编译的时候临时决定 
    int qty; //表示栈里的数字个数    
} stack;  //代表栈的结构体 
//栈的初始化函数
void stack_init(stack * /*代表要初始化的栈*/);
//栈的清理函数
void stack_deinit(stack * /*代表要清理的栈*/);
//判断栈是否空的函数
int stack_empty(const stack * /*代表栈*/);
//判断栈是否满的函数
int stack_full(const stack *);
//获得栈里数字个数的函数 
int stack_size(const stack *);
//向栈里加入数字的函数 
int stack_push(stack *, int );
//从栈里获取数字的函数(同时从栈里删除数字)
int stack_pop(stack *, int *);
//从栈里获得数字的函数(不会删除数字)
int stack_top(const stack *, int *);  
#endif      // __01STACK_H__

01stack.c

/*
栈演示
*/ 
#include "01stack.h"
//栈的初始化函数
void stack_init(stack *p_stack/*代表要初始化的栈*/) { 
    p_stack->qty = 0; //栈里没有数字
}
//栈的清理函数
void stack_deinit(stack *p_stack/*代表要清理的栈*/) {
     p_stack->qty = 0; //把栈里的所有数字删除 
} 
//判断栈是否空的函数
int stack_empty(const stack *p_stack/*代表栈*/) {
    return !(p_stack->qty);  
}
//判断栈是否满的函数
int stack_full(const stack *p_stack) {
    return p_stack->qty >= SIZE;   
} 
//获得栈里数字个数的函数 
int stack_size(const stack *p_stack) {  
    return p_stack->qty; 
} 
//向栈里加入数字的函数 
int stack_push(stack *p_stack, int val) {    
    if (p_stack->qty >= SIZE) {
       //检查栈是否已经满了 
        return 0; 
    }
    p_stack->buf[p_stack->qty] = val;  //把新数字赋值给qty成员变量做下标的存储区
    p_stack->qty++; //把栈里的数字个数加一 
    return 1; //返回1表示加入成功        
} 
//从栈里获取数字的函数(同时从栈里删除数字)
int stack_pop(stack *p_stack, int *p_val) {
    if (!p_stack->qty) { 
       //检查栈是不是空的
       return 0;  
    }
    *p_val = p_stack->buf[p_stack->qty - 1];
//从qty-1做下标的获得数字(这个数字就是最后一个数字)并通过整数类型指针形式参数把数字传递给调用函数 
    p_stack->qty--; //数字个数减一 
    return 1; //返回1表示成功获得并删除数字   
} 
//从栈里获得数字的函数(不会删除数字)
int stack_top(const stack *p_stack, int *p_val) {
    if (!p_stack->qty) { 
       //处理没有数字的情况 
       return 0; 
    }
    *p_val = p_stack->buf[p_stack->qty - 1]; 
    return 1;  
} 

01stack_main.c

/*
栈测试
*/
#include <stdio.h>
#include "01stack.h"
int main() {
    int val = 0; 
    stack stk = {0}; 
    stack_init(&stk); //进行栈的初始化 
    printf("数字个数是%d\n", stack_size(&stk)); /*获得栈里数字个数*/
    printf("判断空的结果是%d\n", stack_empty(&stk));  //判断栈是否空 
    printf("判断满的结果是%d\n", stack_full(&stk)); 
    //判断栈是否满 
    stack_push(&stk, 10); 
    stack_push(&stk, 20); 
    stack_push(&stk, 30); 
    printf("数字个数是%d\n", stack_size(&stk)); /*获得栈里数字个数*/
    printf("判断空的结果是%d\n", stack_empty(&stk));  //判断栈是否空 
    printf("判断满的结果是%d\n", stack_full(&stk)); 
    stack_push(&stk, 40); 
    stack_push(&stk, 50); 
    printf("数字个数是%d\n", stack_size(&stk)); /*获得栈里数字个数*/
    printf("判断空的结果是%d\n", stack_empty(&stk));  //判断栈是否空 
    printf("判断满的结果是%d\n", stack_full(&stk)); 
    stack_top(&stk, &val); 
    printf("最后一个数字是%d\n", val); 
    while (1) { 
        if (!stack_pop(&stk, &val)){
            //获得一个数字并把数字从栈里删除 
            //当不能从栈里获得数字时,就跳出循环
            break;           
        }
        printf("%d ", val); 
    } 
    printf("\n"); 
    printf("数字个数是%d\n", stack_size(&stk)); /*获得栈里数字个数*/
    printf("判断空的结果是%d\n", stack_empty(&stk));  //判断栈是否空 
    printf("判断满的结果是%d\n", stack_full(&stk)); 
    stack_deinit(&stk); //进行栈的清空 
    return 0; 
}

猜你喜欢

转载自www.cnblogs.com/hyq-lst/p/12575358.html