神奇少年的数据结构学习笔记三(栈与队列)

 

目录

 1.栈的定义

2.队列的定义


1.栈的定义

1.1栈是限定仅在表尾进行插入和删除操作的线性表

我们把允许插入和删除的一端称为栈顶(线性表的表尾),另一端称为栈底,不含任何元素的栈称为空栈。栈又称后进先出的线性表,简称LIFO结构。

插入操作叫做进栈,删除操作叫做出栈。

1.2进栈出栈的变化形式

  • 1,2,3进,3,2,1出       出栈次序  3,2,1
  • 1进,1出,2进,2出,3进,3出    出栈次序  1,2,3
  • 1进,2进,2出,1出,3进,3出    出栈次序  2,1,3
  • 1进,1出,2进,3进,3出 ,2出   出栈次序  1,3,2
  • 1进,2进,2出,3进,3出  ,1出  出栈次序  2,3,1

1.3栈的顺序存储结构

栈的顺序存储其实也是线性表的存储的简化,简称顺序栈。下标0的一端作为栈底。

栈的顺序存储结构由于只允许栈顶进出元素,所以不存在线性表插入和删除需要移动元素的问题,不过有一个很大的缺陷,就是要事先确定存储空间的大小。对于一个栈,也只能考虑周全,设计合适大小的数组来处理,对于两个相同类型的栈,可以最大限度利用事先开辟的存储空间进行操作。

top1和top2是栈1和栈2的栈顶指针,top1+1==top2  时,代表栈满了。

一般使用这个双栈共享结构的,通常都是两个栈有相反关系,就是一个栈增长时另一个栈在缩短

1.4栈的链式存储结构

栈的链式存储结构,简称栈链。

栈只是栈顶做删除和插入操作,由於单链表有头指针,而栈顶指针也是必须的,所以比较好的办法是把栈顶放在单链表的头部。由于已经有头部在头顶了,单链表中比较常见的头结点就失去了意义,通常对于栈链说,是不需要头结点的。

进栈操作:把当前栈顶元素赋值给新结点的直接后继>将新结点s赋值给栈顶指针

出栈操作:将栈顶结点赋值给p>使栈顶元素下移一位,指向后一结点>释放结点

如果使用过程中元素不可预料,有时小,有时非常大,那么最好用链栈,如果变化在可控范围

2.队列的定义

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表

是一种先进先出的线性表,简称FIFO,允许插入的称为队尾,允许删除的一端称为队头。

2.1队列的顺序存储结构

顺序存储结构的不足:插入时就是在队尾追加一个元素,不需要移动任何元素,时间复杂度为O(1),删除出队时,为了保证队头不为空,所有元素都要向前移动,时间复杂度O(1).

由于每次都要移动全部元素所以如果不去限制队列的对头一定要在下标为0的位置就不用所有元素都向前移动。所以引入两个指针,一个指向对头元素,一个指向队尾元素的下一个位置。(循环队列)

2.2队列的链式存储结构

其实就是线性表的单链表,只不过它只能尾进头出,简称链队列。队头指针指向链队列的头结点,队尾指针指向终端结点,空队列时都指向头结点。

入队操作:在链表尾部插入结点

出队操作:头结点的后继结点出队,将头结点的后继改为出队结点的后继结点

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章