数据结构学习笔记9--栈和队列的顺序存储结构

栈和队列的相同点和不同点

相同点:栈和队列是两种重要的数据结构,也是两种特殊的线性表结构。从数据的逻辑角度看,栈和队列是线性表;从操作的角度来看,栈和队列的基本操作是线性表基本操作的子集,是操作受限制的线性表。

不同点:栈是限定仅在表尾进行插入删除的线性表,它的存其特征是后进先出;队列是限定只允许在表的一端进行插入,而在另一端进行删除元素的线性表,它的存取特征是先进先出。

栈的顺序存储表示与实现:栈的顺序存储又称顺序栈,它是利用一组地址连续的存储单元一次性存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈的位置。(要设置一个指针是因为栈是在栈顶进行插入删除操作)

#define StackSize<顺序栈的容量>
typedef struct snode{
      ElemType data[StackSize]
      int top;}snode;
其中,snode相当于一个栈,data[i]存放第i个元素。初始化时,top赋值为-1.

队列的顺序存储表示与实现:与栈一样,队列的顺序存储指的是利用一组地址连续的存储单元存放队列中的元素,并设置两个分别指示队头元素的存储位置和队尾元素的存储位置的变量front,rear,分别称为队头指针和队尾指针。(要设置两个指针是因为要在队尾进行插入操作,而在队头进行删除操作)

顺序队列的类型变量定义如下:

#define QueueSize<顺序队列的容量>
typedef struct qnode{
      ElemType data[QueueSize]
      int front,rear;}qnode;
初始化时,front和rear均赋值为-1.

假溢出:当rear=QueueSize-1时,队列为满,如果再加入新元素,就会产生溢出。但是这种溢出不是真正的溢出,在数组的前端可能还有空位置(删除操作),所以这是一种假溢出。

为了解决顺序队列中的“假溢出”问题,需要把数组想象成为一个首尾相接的环,称这种数组为“循环数组”,存储在其中的队列称为“循环队列”。

解决队满,队空的判断问题有3种方法:

1.设置一个布尔变量以区别队满还是队空。

2.浪费一个元素的空间,用于区分队满还是队空。

3.是用一个计数器记录队列中的元素个数。(即队列长度)

在使用中,大多采用第2种方法,即队头、队尾指针中有一个指向元素,而另一个指向空元素。

通常约定队尾指针指示队尾元素在一维数组中的当前位置,队头指针指示在一维数组中的当前位置的前一个位置。




你可能感兴趣的:(数据结构及算法分析)