在前面讲解两个比较基础的数据结构——链表、顺序表,做了一定的基础,因此用这两个方式来实现现在的,队列和栈并不会太难。
目录
---------------------------------------------------------------------------------------------------------------------------------
(一)什么是栈、什么是队列?
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
(1)区别:
原则: 先进后出,后进先出(First in Last out) ---------->栈
先进先出,后进后出(First in First out)----------->队列
我们就按此,进行队列与栈的实现。
(二)实现:
①初始化(创建栈、队列)
栈:
为了实现栈或队列,既可以用顺序表,也可以用链表。
队列:
(1)初始化顺序表:
栈:
InitStack 实现对结构体初始化
队列:
由于需要引入头尾指针,在没有录入数据的时候,会对头尾指针进行初始化~
②销毁队列、栈
栈:
仅仅只需要把 指向动态开辟空间的指针free掉,并将所有数据置空即可 。
队列:
队列的销毁 就和链表的销毁没两样
都是需要去遍历链表------>销毁一个 ,保存下一个的地址
③增加数据
栈:
增添数据的思想很简单,仅仅需要考虑动态开辟的数组内容是否需要增容,如果不需要 直接就可以存放数据。
队列:
在队列中添加数据,需要变动的就只是队尾(tail)。添加一次,变更一次。
④删除数据
栈:
当然,对于第二个assert可以进行优化 那当然是后面的事情了。
队列:
队列的元素删除有点复杂 结合图形来理解>
很多人可能忽略掉 上面红框处的代码:
在删除的前提下,需要保证,删除后不会留下野指针。
⑤返回顶、底的元素
栈: 栈顶
为什么会-1?
栈: 栈底
可理解栈顶、栈底 分别是数组的末元素 和首元素 。
队列:
通过,队头 、队尾的指针很容易 找到队列的首尾数据~。
⑥栈、队列是否为空
栈:
这里会牵涉到新的类型(布尔类型) ----->用于判断 true 与 false
借此
我们可以把这个用到上面Pop的函数里面>
队列:
⑦ 栈、队列元素个数:
栈:
计算队列的长度 就是遍历链表 也就不做过多分析了~。
总结:
理解栈、队列的实现,是为数据结构打基础。
加油! 祝你好运~