一、头文件展示
这里的栈是用顺序表实现的,而队列则是用链表来实现的,这里的队列需要管理头指针和尾指针。
二、功能实现
栈的功能
1、栈的初始化
这里的top有两种初始化,一种top=-1,即表示为栈顶元素,另一种top=0,即栈顶元素的下一个元素。
这里使用top=0的理由也很简单,top等于多少就代表栈内有多少元素,方便size函数和empty函数的实现。
2、栈的插入
这里的assert用于判断ps指针是否为空指针,capacity用于记录栈的空间大小,当top=capacity时意味着空间不够了需要扩容,这里用realloc在之前空间的基础上二倍扩容,这里的reallloc可以原地扩容,但当后面空间不够的时候就只能异地扩容了。把x放在a[top],并top++完成栈的插入。
3、栈的删除
这里的STEmpty是判断栈元素是否为空的,如果为空返回true,否则返回false。这里取反是为判断栈内元素是否为空,如果为空返回true,取反后为false,assert报错,不为空false,取反为true,assert不报错。这里只对top--,是因为我们通过栈顶元素取值,top--栈顶元素改变,不改变空间是避免删数据缩容过后插入数据又需要扩容。
4、栈的大小
这里为什么返回top的原因之前已讲解过,所以这里不多赘述。
5、判断栈是否为空
与上面原理相同,只需要判断top是否等于0即可。
6、栈的清理
free掉堆上申请的空间,并对top、capacity赋值0和指针置空。
7、获取栈顶元素
获取栈顶元素还需要判空,和判断ps指针是否为空。
队列的功能
1、队列的初始化
对管理的头尾指针置空,size赋值0.
2、队列的销毁
这里与单链表销毁大致相同,对单链表有些许遗忘的读者可以移步另一篇博客温习单链表相关知识,链接:数据结构之单链表-CSDN博客
3、队列的插入
由于队列先进先出的数据移动方式,所以在头指针出数据,在尾指针插入数据。
malloc一个节点用于插入数据,并将其初始化。第一种情况,当head为空,代表队列为空,assert判断tail是否为空,head为空则tail一定为空,不为空则报错; 第二种情况,head不为空,直接链接尾指针,size++,完成队列插入。
4、队列的删除
第一种情况,当头尾指针指向同一节点时,直接free掉该节点即可,并对指针置空;第二情况头尾指针分别指向不同节点,需要保留head的下一个节点的地址,free掉head,然后tmp在赋值给head即可,然后size--,完成队列的删除。
5、队列的大小
插入和删除都在维护size值,所以队列的大小返回size的值即可。
6、判断队列是否为空
只有头指针和尾指针都为空时,队列无元素,所以只需要判断头指针和尾指针是否同时为空即可。
7、获取队头元素的值
判断是否为空,直接返回头指针的值即可。
8、获取队尾元素的值
与上面同理。
三、总结
栈先进后出多用顺序表实现,队列先进先出多用链表实现。
关于栈和队列的实现还需自己去动手画图去辅助理解,这里有两道习题帮助掌握栈和队列,正好也可以利用自己实现的代码去完成题目。
最后,如果本篇博客对您有所帮助,请留下一个免费的赞和收藏吧,我们下期再见!