数据结构(五)栈和队列

同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图1 所示:


图1:栈存储结构示意图

栈对数据 "存" 和 "取" 的过程有特殊的要求:

1.栈只能从一端存取数据,另一端是封闭的
2.在栈中,无论是存数据还是取数据,都必须遵循“先进后出”的原则

栈是一种只能从一端存取数据且遵循“先进后出”原则的线性存储结构

通常栈的开口端被称为栈顶;相应地,封口端被称为栈底。向栈中添加元素,此过程被称为进栈(入栈或压栈);从栈中提取出指定元素,此过程被称为出栈(或弹栈);

栈是一种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种方式:

顺序栈:采用顺序存储结构实现的栈。
链栈:采用链表结构实现的栈。

基于栈结构对数据存取采用 "先进后出" 原则的特点,它可以用于实现很多功能。例如,我们经常使用浏览器在各种网站上查找信息。假设先浏览的页面 A,然后关闭了页面 A 跳转到页面 B,随后又关闭页面 B 跳转到了页面 C。就可以使用栈存储结构。

顺序栈

顺序栈,即用顺序表实现栈存储结构。

图2:顺序栈示意图

顺序表实现站存储思路:在顺序表中设定一个实时指向栈顶元素的变量(一般命名为 top),top 初始值为 -1,表示栈中没有存储任何数据元素,及栈是"空栈"。一旦有数据元素进栈,则 top 就做 +1 操作;反之,如果数据元素出栈,top 就做 -1 操作。

链栈

链栈,即用链表实现栈存储结构。


图3:链栈示意图

将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" 和 "出栈" 操作时做大量遍历链表的耗时操作。

链表的头部作为栈顶,意味着:

在“入栈”操作时,需要将数据从链表头部插入;
在“出栈”操作时,需要删除链表头部首元节点;


队列

队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。

与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 4 所示:


图4:队列结构示意图

通常,称进数据的一端为 "队尾",出数据的一端为 "队头",数据元素进队列的过程称为 "入队",出队列的过程称为 "出队"。

队列中数据的进出要遵循 "先进先出" 的原则

队列的实现

队列存储结构的实现有以下两种方式:

  • 顺序队列:采用顺序存储结构实现的队列
  • 链队列:采用链式存储结构实现的队列

顺序队列简单实现

由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素,如图5 所示:

图5:顺序队列结构示意图

在图 5 基础上将 {1,2,3,4} 用顺序队列存储的实现操作如图 6 所示:


图6:顺序队列入队示意图

在图 6 基础上,顺序队列中数据出队列的实现过程如图 7 所示:


图7:顺序队列出队示意图
此方法带来的问题

全部操作完成后,指针 top 和 rear 重合位置指向了 a[4] 而不再是 a[0]。也就是说,整个顺序队列在数据不断地进队出队过程中,在顺序表中的位置不断后移。
顺序队列整体后移造成的影响是:

  • 前面的存储位置无法释放,且不会被使用。如果是java实现 造成内存泄漏
  • 如果顺序表申请空间不够大,造成数组溢出。

为了解决以上两个问题,可以使用巧妙的方法将顺序表打造成一个环状表,如图 8 所示:


图8:环状顺序队列

图 8 只是一个想象图,在真正的实现时,没必要真创建这样一种结构,还是使用之前的顺序表,也和之前的程序一样,只需要对其进行一点小小的改变。(增加判断,到达队尾返回开头)具体代码不描述。

链式队列的简单实现

链式队列,简称链队列,即使用链表实现的队列存储结构
链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素,如图 9 所示:

图9:链式队列的初始状态

链式队列数据入队

链队队列中,当有新的数据元素入队,只需进行以下 3 步操作:

  • 1.将数据元素用节点包裹
  • 2.将直接前驱指针指向新节点
  • 3.将rear 游标指向新节点
图10:链式队列入队示意图

链式队列数据出队

在图10的基础上,我们将元素 1 和 2 出队,则操作过程如图 11 所示:


图11:链式队列出队示意图

由于顺序表的局限性,我们在顺序队列中实现数据入队和出队的基础上,需要对实现逻辑进行改进(环状顺序队列),令其能够充分利用数组中的空间。
链式队列就不需要考虑空间利用的问题,因为链式队列本身就是实时申请空间。因此,这可以算作是链式队列相比顺序队列的一个优势。

你可能感兴趣的:(数据结构(五)栈和队列)