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

堆:数据先进先出;

栈:数据先进后观;

在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 = ;
OPENSSL_sk_push(st, &a); int b = ;
OPENSSL_sk_push(st, &b); char *c = "hello";
OPENSSL_sk_push(st, c); char d[] = {};
OPENSSL_sk_push(st, d); char e = 'A';
OPENSSL_sk_push(st, &e); //返回栈内数据个数
if (OPENSSL_sk_num(st)==) {
printf("sk_num PASS\n");
} //获取指定index数据
int *getb = OPENSSL_sk_value(st, );
if (*getb==b) {
printf("sk_value PASS\n");
} //获取指定数据,返回index
if (OPENSSL_sk_find(st,"hello")==) {
printf("sk_find PASS \n");
} //在位置2插入一个 数据 TAOBAO,返回总数
if (OPENSSL_sk_insert(st, "TAOBAO", )==) {
printf("sk_insert PASS\n");
} int ff = ;
OPENSSL_sk_push(st, &ff);
//在栈顶移出一个数据, 返回删除的元素
char *popDT = OPENSSL_sk_pop(st);
if (*popDT==ff) {
printf("sk_pop PASS\n");
} //从栈中移出所有的元素,并释放内存,并且释放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
pop and free
pop and free
pop and free
pop and free
pop and free
Program ended with exit code:

3. 另外还可以自定义栈

使用 openssl 提供的safestack.h宏

测试使用 openssl 1.1.0c

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

openssl stack 数据结构栈基本操作的更多相关文章

  1. [C++][数据结构]栈(stack)的实现

    对于栈的定义,前人之述备矣. 我实现的是一个stack<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作. 主要的 ...

  2. C++数据结构之Stack(栈)

    stack,栈,是好比堆积木似的数据结构,从上之下堆积,取出时按"LIFO"-last int first out后进先出的规则.栈一般为线程所独有,也就是每个线程有其自有的栈,与 ...

  3. [置顶] ※数据结构※→☆线性表结构(stack)☆============栈 序列表结构(stack sequence)(六)

    栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...

  4. java数据结构 栈stack

    栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...

  5. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  6. 数据结构与算法之Stack(栈)——in dart

    用dart 语言实现一个简单的stack(栈).栈的内部用List实现. class Stack<E> { final List<E> _stack; final int ca ...

  7. 基本数据结构 -- 栈简介(C语言实现)

    栈是一种后进先出的线性表,是最基本的一种数据结构,在许多地方都有应用. 一.什么是栈 栈是限制插入和删除只能在一个位置上进行的线性表.其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许 ...

  8. Stack(栈)

    Stack(栈)是一种后进先出的数据结构,下面介绍一下栈的具体运用: 一.Stack 中的 empty 函数 stack<int> s( 5 , 10) ; s.empty()  ;   ...

  9. 数据结构栈的java实现

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表. 实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线 ...

随机推荐

  1. Java Thread 多线程 介绍

    1.线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程. 当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 2.线程 ...

  2. 如何查看oracle数据库的所有的关键字

    管理员账户登录后,执行以下命令:  select * from v$reserved_words 附上参考: NOMONITORINGRECORDS_PER_BLOCKCASCADEDYNAMIC_S ...

  3. Android 中如何计算 App 的启动时间?

    (转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...

  4. powerDesigner生成excel版本的数据库文件

    今天收到一个需求,要把数据库设计给一个excel版本的,百度出来一个脚本文件,很好用发现,留个纪念 在pd中,shift+ctrl+X,打开脚本运行,脚本如下,附件也留了一份: '********** ...

  5. Monkey的ADB命令简单使用示例和解析

    进行简单的压力测试: 1. adb shell monkey –p 包名 –v-v 3000 >E:\bugLog.txt -v -v 标识打印的日志的详细级别为2级,更高级有3级,也可以用1级 ...

  6. Ubuntu 16.04环境布署小记

    本系列文章记录了升级Ubuntu 16.04的布署过程 回到目录 10. 安装Mono, Xsp 当前版本16.04.1的系统源的Mono版本为4.2.1,如需使用最新版本(本文书写时稳定版本为4.6 ...

  7. js兼容性问题总结

    JS中出现的兼容性问题的总结1.关于获取行外样式 currentStyle 和 getComputedStyle 出现的兼容性问题  我们都知道js通过style不可以获取行外样式,当我们需要获取行外 ...

  8. Spring配置文件详解

      转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常有用 spring配置文件是用于指导Sp ...

  9. SeleniumIDE从0到1 (Selenium IDE 录制)

    seleniumIDE安装成功后下面我们用百度网址来简单录制下: 简介一:百度输入框录制操作 1.打开SeleniumIDE 2.SeleniumIDE地址栏中输入百度网址:[https://www. ...

  10. cf 712E Memory and Casinos

    题意:有一行$n(n \leq 100000)$个方格,从左往右第$i$个方格的值为$p_i(p_i = \frac{a}{b}, 1 \leq a < b \leq 1e9)$,有两种操作,一 ...