初学者很容易认为顺序表、链表、栈、队列是四种并列的数据结构,其实仔细想想并不是。
注意区分:
顺序表和链表是指数据的存储结构,是线性表的一种,顺序表一般指的就是数组,数据存储的逻辑顺序和物理顺序都是连续的,链表的数据在逻辑上是连续的,但是物理上并不是连续的。
而栈和队列应该算是一种数据的存取逻辑,栈是中先进后出的逻辑,队列是先进先出的逻辑;
栈这种数据存取的逻辑结构可以用顺序表这种数据存储结构来实现,也可以用链表来实现;同样的,队列可以用顺序表来实现,也可以用链表来实现。
一般的,我们的业务需求可能是需要一个栈或者一个队列,比如函数的入栈和出栈,就需要栈这种逻辑结构,比如操作系统中任务的调度,常常就需要用到队列这种逻辑结构;
那么,这两种逻辑结构是怎么来实现的?可以用顺序表或者链表。
由此我们可以看到,这里可以进行组合。
顺序表实现的栈,也就是顺序栈;
链表实现的栈,也就是链栈;
顺序表实现的队列,也就是顺序队列;
链表实现的队列,也就是链队列;
另外,链表还可以分为单链表,支持单向检索,双链表,支持双向检索,单向循环链表,支持到末尾后又回到开头,双向循环链表,支持顺时钟转和逆时钟转;
从另一个方面来考虑,我们可以把顺序表和链表理解成栈和队列的驱动,顺序表和链表,通常都会封装出增删改查等具体操作,然后栈和队列调用这些函数来实现业务中数据的存取逻辑。
等等。
这些具体是怎么回事呢?接下来分别记录一下。
顺序表
类似的内容很多,直接参考这篇吧
【数据结构】——顺序表介绍(独家介绍,小白必看!!)-CSDN博客
补充说明
1、理解顺序表结构体
一开始我的理解是,这里数据类型已经确定了,容量和大小不是应该给一个就可以了吗?
容量就=size*sizeof(int)
我以为size和capacity都是对数组的描述。
其实,这里不是这么理解的。
array是数组的首地址指针,也就是顺序表的句柄;
size指的是顺序表的有效长度,而不是数组的长度,千万注意;
capacity指的是数组的长度;
意思就是,我们建了个数组来实现顺序表,其中,数组的长度就是我后面顺序表能容纳元素的容量capacity,而size就是当前顺序表的长度,比如我往顺序表放一个数据,size就是1,放两个数据,size就是2……以此类推。
2、动态顺序表
因为数组在创建后大小就会固定下来,所以如果我们直接使用数组来实现顺序表,那么就不够灵活,无法实现扩容。
所以我们这里使用动态创建内容的方式。
在扩容时用realloc,当realloc的第一个参数为0时,其效果等同于malloc,用realloc可以完美实现最初开辟空间和增容的功能。
C 标准库 – <stdlib.h> | 菜鸟教程
3、头插、尾插,头删、尾删
头插就是插入时将新元素插在表头部,尾插就是插入时将新元素插在表尾部。
同理,头删就是删除头部,尾删就是删除尾部。
链表
类似的内容很多,直接参考这两篇吧
单链表
【数据结构】——单链表超详细介绍(独家介绍,小白必看!!!)-CSDN博客
双链表
数据结构——双向链表-CSDN博客
栈
类似的内容很多,直接参考这篇吧
数据结构之——栈_数据结构栈_WenJieya的博客-CSDN博客
队列
类似的内容很多,直接参考这篇吧
【数据结构之队列系列】队列详解_结构体队列-CSDN博客
相关视频可参考: