数据结构之线性表栈队列

文章目录

      • 数据结构之线性表栈队列
        • 一定义:
        • 二实现方式和顺序表示
        • 三简述栈和队列的共同点和不同点.它们与线性表有什么关系:

数据结构之线性表栈队列

一定义:

1、线性表(linear list):

是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。

2、栈(Stack):

栈是限定仅能在表尾进行插入或删除操作的线性表。对栈来说,表尾称为栈顶、表头称为栈底,不含元素的空表称为空栈。

由于栈的上述特性,最先入栈的元素最后才能被删除,最晚入栈的元素最先被删除,所以栈又称为后进先出的线性表。

应用例子:进制转换、括号匹配检验、行编辑程序、迷宫求解、表达式求值、递归实现

3、队列(Queue):

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

应用例子:操作系统中的作业排队

双端队列,是限定插入和删除操作在表的两端进行的线性表,尽管双端队列看起来比栈和队列灵活,但实际上在应用程序中远不及栈和队列有用。

Stack栈类与、Queue队列与线性表的区别和联系

栈和队列都属于特殊的线性表

二实现方式和顺序表示

1、线性表:

用一组地址连续的储存单元依次存储线性表的数据元素。以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。只要确定了数据元素的起始位置,就可随机地访问数据元素。但是这种表示方法不便于插入和删除元素,每插入或删除一个元素,都要移动插入或删除位置之后的数据元素在连续储存单元中的位置,而且除了重新分配内存,否则在程序运行过程中不能动态地增加储存单元的数量。

2、栈:

和线性表相似,栈也有两种储存方式,顺序栈和链式栈。

顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用光而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用;

而链栈使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。

3、队列

1)顺序队列

建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置,

每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。当front=rear时,队列中没有任何元素,称为空队列。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元。

顺序队列中的溢出现象:

(1) "下溢"现象:当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

(2)"真上溢"现象:当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。

(3)"假上溢"现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

2)循环队列

在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。自己真从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。

三简述栈和队列的共同点和不同点.它们与线性表有什么关系:

共同点:都有顺序结构和链式结构,都是只能在线性表的端点插入和删除。

不同点:操作不同。栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。

与线性表的关系:栈和队列都是线性表,都是限制了插入删除点的线性表(或者说是控制了访问点的线性表)。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

你可能感兴趣的:(数据结构)