zoukankan      html  css  js  c++  java
  • openssl stack 数据结构栈基本操作

    堆栈是两种不同的数据结构;

    堆:数据先进先出;

    栈:数据先进后观;

    在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据。

    openssl stack 栈类似于数组,元素下标从0开始;

    1. openssl stack 主要接口有

    //创建一个空栈,参数可指定排序方法,因为openssl不知道里面存放的是什么类型的数据,所以排序方法需要用户实现,当参数为NULL,同下方法
    OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_compfunc cmp);

    //创建一个空栈, OPENSSL_STACK
    *OPENSSL_sk_new_null(void);

    //释放栈,并不释放栈内元素内存
    void OPENSSL_sk_free(OPENSSL_STACK *);

    //删除并释放所有栈内元素,最后释放栈,可以指定回调函数,栈每次释放一个元素都会回调该回调函数
    void OPENSSL_sk_pop_free(OPENSSL_STACK *st, void (*func) (void *));

    //栈深copy, OPENSSL_STACK
    *OPENSSL_sk_deep_copy(const OPENSSL_STACK *, OPENSSL_sk_copyfunc c, OPENSSL_sk_freefunc f);

    //在栈指定位置插入元素,成功返回该栈所有元素的个数
    int OPENSSL_sk_insert(OPENSSL_STACK *sk, const void *data, int where);

    //删除栈指定位置元素,成功返回删除的该元素
    void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc);

    //删除栈指定元素,成功返回删除的该元素
    void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p);

    //在栈中查找指元素,成功返回该元素位置
    int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data);

    //同上,
    int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data);

    //在栈顶添加一个元素,成功返回栈元素总数
    int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data);

    //在栈位置0次添加一个元素,类似 insert(st,0);
    int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data);

    //移出栈位置0处的元素,类似pop
    void *OPENSSL_sk_shift(OPENSSL_STACK *st);

    //在栈顶移出一个元素,并释放该元素内存,
    void *OPENSSL_sk_pop(OPENSSL_STACK *st);

    //设置栈元素为0,不释放栈
    void OPENSSL_sk_zero(OPENSSL_STACK *st);

    //设置栈的排序方法 OPENSSL_sk_compfunc OPENSSL_sk_set_cmp_func(OPENSSL_STACK
    *sk, OPENSSL_sk_compfunc cmp);

    //copy 栈 OPENSSL_STACK
    *OPENSSL_sk_dup(const OPENSSL_STACK *st);

    //栈排序
    void OPENSSL_sk_sort(OPENSSL_STACK *st);

    //栈是否排序
    int OPENSSL_sk_is_sorted(const OPENSSL_STACK *st);

    2. 测试示例

        //创建一个空的栈
        OPENSSL_STACK *st = OPENSSL_sk_new_null();
        
        int a = 10;
        OPENSSL_sk_push(st, &a);
        
        int b = 100;
        OPENSSL_sk_push(st, &b);
        
        char *c = "hello";
        OPENSSL_sk_push(st, c);
        
        char d[10] = {0};
        OPENSSL_sk_push(st, d);
        
        char e = 'A';
        OPENSSL_sk_push(st, &e);
        
    
        //返回栈内数据个数
        if (OPENSSL_sk_num(st)==5) {
            printf("sk_num PASS
    ");
        }
        
        //获取指定index数据
        int *getb = OPENSSL_sk_value(st, 1);
        if (*getb==b) {
            printf("sk_value PASS
    ");
        }
        
        //获取指定数据,返回index
        if (OPENSSL_sk_find(st,"hello")==2) {
            printf("sk_find PASS 
    ");
        }
        
        
        //在位置2插入一个 数据 TAOBAO,返回总数
        if (OPENSSL_sk_insert(st, "TAOBAO", 2)==6) {
            printf("sk_insert PASS
    ");
        }
        
        
    
        int ff = 88;
        OPENSSL_sk_push(st, &ff);
        //在栈顶移出一个数据, 返回删除的元素
        char *popDT = OPENSSL_sk_pop(st);
        if (*popDT==ff) {
            printf("sk_pop PASS
    ");
        }
    
        //从栈中移出所有的元素,并释放内存,并且释放st;
        //每删除一个元素,回调一次popfreeCallBack回调函数
        OPENSSL_sk_pop_free(st, popfreeCallBack);

    输出日志

    sk_num PASS
    sk_value PASS
    sk_find PASS 
    sk_insert PASS
    sk_pop PASS
    pop and free 10 
    pop and free 100 
    pop and free 1112490324 
    pop and free 1819043176 
    pop and free 0 
    pop and free 352053569 
    Program ended with exit code: 0
    View Code

    3. 另外还可以自定义栈

      使用 openssl 提供的safestack.h宏

    测试使用 openssl 1.1.0c

    参考:https://www.openssl.org/docs/man1.1.0/crypto/OPENSSL_sk_new_null.html

  • 相关阅读:
    python函数练习题2
    python函数练习题1
    数字是否是10的整数倍
    关于循环的作业:登陆程序
    用for循环写这段代码
    while循环语句
    在CentOS8 上安装Python3
    时隔半年再写购物车程序并改进
    vue上传
    根据生日计算年龄
  • 原文地址:https://www.cnblogs.com/cocoajin/p/6139953.html
Copyright © 2011-2022 走看看