总结三:数据结构-栈和队列

一、栈

1.1 栈的定义

         栈是限定仅在表尾进行插入或删除操作的线性表。因此对于站来说,表尾端称为栈顶,相应的表头端称为栈底。栈又称为后进先出的线性表(简称LIFO结构)不含元素的空表称为空栈。

1.2 栈的表示和实现

         和线性表类似,栈也有两种存储表示方法。

         顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

         栈的初始化操作为:按设定的初始分配量进行第一次存储分配,base可称为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。成top为栈顶指针,其初值指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

         进栈:

 

         出栈:

 

         链式栈:

1.3 栈的应用举例

1.3.1 迷宫求解

求迷宫中一条路径的算法基本思想是:若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除通道块。

迷宫就是栈的一个模型,其中,栈中数据元素包含如下基本元素:1. 路径上的序号;2. 通道块的坐标;3. 从当前通道块到下一通道块的方向。

1.4 栈与递归的实现

1.4.1 Hanoi塔问题

         汉诺塔移动圆盘的基本思想:当n=1时,只要将编号为1的圆盘从塔座X直接移动到塔座Z上即可;当n>1时,需要利用塔座Y作为辅助塔座,若能设法将压在编号为n的圆盘只上的n-1个圆盘从塔座X移动到塔座Y上,则可先加你个编号为n的圆盘从塔座X移动到塔座Z上,然后再将塔座Y上的n-1个圆盘移动到塔座X上。而如何将n-1个圆盘从一个塔座移动到另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。

二、队列

1.1 队列的定义

         队列是一种先进先出(FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。允许插入的一端叫做队尾,允许删除的一端叫做队头。

 

         除了栈和队列之外,还有一种限定性数据结构是双端队列。双端队列是限定插入和删除操作在表的两端进行的线性表。在实际应用程序中远不及栈和队列有用。

1.2 队列的链式表示和实现

         和线性表类似,队列也可以有两种存储表示。

         用链表表示的队列简称链队列。(Q.front和Q.rear分别表示头指针和尾指针)

1.3 队列的顺序表示和实现

在队列的顺序存储结构中,除了用一组地址连续的存储单元一次存放从队头到队尾的元素之外,尚需附设两个指针front和rear分别只是对垒头元素及队列尾元素的位置。

入列:

出列:

如上图,出列之后,队列的实际可用空间并未占满,但是队头之前的空间在该队列中已经不可使用了,所以一个巧妙的办法是将顺序队列臆造为一个环状的空间,称之为循环队列

入列:

出列:

空队列和满队列:

            由上图,只根据Q.front=Q.rear无法判别队列空间是“空”还是“满”。可有两种处理方法:其一是另设一个标志位以区别队列是“空”还是“满”;其二是少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置上”作为队列“满”状态的标志。

猜你喜欢

转载自blog.csdn.net/LittleFlown/article/details/84075070