目录
一、什么是栈
1、栈的定义
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶
总的来说:无论出栈还是入栈都是从栈顶开始,所以说也印证了栈的先入后出这个原则。
2、栈的结构
3、栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。
所以栈的结构我们可以如下定义:
进栈:
出栈:
代码实现:
Stack.h部分
Stack.c部分:
ps:在这里栈的初始化我将top初始化为了0,所以我的top每次指向的是最后一个数据的下一个位置。
分析:
如下图所示,我将top初始化为0,所以在后面每当我插入一个数据后我的top要加1,所以top每次指向的是最后一个数据的下一个位置。
当然,如果我们按如下初始化top的值也可以让top每次都指向最后一个数据。
分析:
这里我们将top初始化为-1,这样后面每当我们插入数据时top加1,top因此也指向了最后一个数据的位置。
二、队列
1、队列的定义
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)。
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。
2、队列的结构
队列只能在一端插入数据 ,而另外端进行数据的出队列。
3、队列的实现
在这里队列也可以使用数组和链表的结构实现,但是使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
所以,队列的结构如下定义:
但是为了避免双指针的问题,我们又定义了一个结构体:
入队:
出队:
代码实现:
Queue.h部分
Queue.c部分
三、总结
在栈和队列这里,我们要理解栈的先入后出和队列的先进先出 ,他们的结构是怎样的,程序在运行时他们的结构是怎样变化的,这里建议自己动手画个图,有利于加深自己的理解。
四、栈和队列的概念练习题
答案: