1.栈
1.1栈的概念和结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO (Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
1.2栈的实现(C)
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
用数组来实现一个栈:
用链表来实现一个栈:
定义一个栈
a 是指向动态开辟的数组指针
top 是栈顶元素的下一个位置的下标(也可以是栈顶元素的下标)
cacpcity 是栈的最大容量
要实现的接口:
一、栈初始化函数
二、栈删除函数
三、压栈函数
四、判断栈是否为空函数
为什么判断栈是否为空还要写一个函数呢?直接 if(ps->top == 0) 不行吗?原因是:写一段代码可能由多个人来完成,top 的含义可能有歧义,所以才写一个函数来判断栈是否为空,并且函数名 STEmpty 增加了可读性。
五、出栈函数
可以将栈顶元素作为返回值
六、返回栈顶元素函数
七、栈打印函数
注意:要访问栈的元素,只能从栈顶开始访问,如果要访问栈顶之下的函数,要将栈顶元素出栈。
2.队列
2.1队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
2.2队列的实现(C)
仍然用单向不循环链表实现队列,为方便出队列和入队列,在链表的头结点和尾结点分别用 head 指针和 tail 指针指向它们。
一、定义队列的结点
二、定义队列
为什么不直接定义 head 和 tail 指向队列的头和尾呢?原因是:如果这样做,每次使用函数来使结点入队列或出队列都要传 head 和 tail 作为参数,并且还要传它们的二级指针,如果我们将 head 和 tail 封装成一个结构体,那函数的参数就只要一个结构体就行了。
定义的队列中还有 size 变量,它存储队列中结点的个数。
结构梳理:
要实现的接口:
三、队列初始化函数
四、队列删除函数
五、入队列函数
六、出队列函数
注意:
1、要检查队列是否为空
2、若队列只有一个结点,也要特殊处理
3、可以将对头元素作为返回值。