3.2.2队列的顺序存储实现

 3.2.2队列的顺序存储实现_第1张图片

 队列是一种操作受限的顺序表(只能在队头删除,在队尾插入)。

所以依旧使用静态数组的形式去存储队列。

(1)创建(初始化)

现定于(顺序队列)的结构体

3.2.2队列的顺序存储实现_第2张图片

 3.2.2队列的顺序存储实现_第3张图片

 3.2.2队列的顺序存储实现_第4张图片

 初始化队列时:

3.2.2队列的顺序存储实现_第5张图片

主函数中声明一个队列:

3.2.2队列的顺序存储实现_第6张图片

 那么判断队列是否为空:

3.2.2队列的顺序存储实现_第7张图片

(2)入队操作(增):

3.2.2队列的顺序存储实现_第8张图片

 把要插入的元素插入到队尾指针指向的位置

然后将队尾指针往后移动一格。

3.2.2队列的顺序存储实现_第9张图片

这就完成了一次入队操作。 

那么这里的队列已满的条件是什么呢?

当整个静态数组都被存满之后:

3.2.2队列的顺序存储实现_第10张图片

3.2.2队列的顺序存储实现_第11张图片

其实是不可以的。

当我们让队头元素依次出列的时候。

3.2.2队列的顺序存储实现_第12张图片

rear依旧等于Maxsize

静态数组的前面的位置

是不是空余了 

 3.2.2队列的顺序存储实现_第13张图片

所以我们对原有的入队操作进行修改。

3.2.2队列的顺序存储实现_第14张图片使rear指针重新指向前面空闲的位置

 3.2.2队列的顺序存储实现_第15张图片

 模运算这就实现了将存储空间在逻辑上变成了“环状”

3.2.2队列的顺序存储实现_第16张图片

我们将这样实现的队列称为循环队列 

此时我们看到rear上面还有存储空间;

我们就可以进行后移。

此时队列已满的条件:队尾指针的在下一个位置是队头即:(Q.rear+1)%MaxSize==Q.front

3.2.2队列的顺序存储实现_第17张图片

也许有人会问,不是还有一个空位置吗。为什么不让front=rear呢?
我们记得判断队空的条件是:front=rear(会混淆)

所以代价就是牺牲一个存储单元。

循环队列的出队操作:(从front出来)

3.2.2队列的顺序存储实现_第18张图片

 3.2.2队列的顺序存储实现_第19张图片

 3.2.2队列的顺序存储实现_第20张图片

3.2.2队列的顺序存储实现_第21张图片

rear=front的时候,就是队列已经为空了(return false)

(4)查找

3.2.2队列的顺序存储实现_第22张图片

 

 

方案一:判断队列已满/已空

3.2.2队列的顺序存储实现_第23张图片

 那么如何对队列元素的个数:
3.2.2队列的顺序存储实现_第24张图片

方案二:
我们在结构体中再定义一个size

 3.2.2队列的顺序存储实现_第25张图片

 

方案三(同时满足两个条件)

3.2.2队列的顺序存储实现_第26张图片

 

一定要注意审题:(队尾指针是指向什么位置)

3.2.2队列的顺序存储实现_第27张图片

 3.2.2队列的顺序存储实现_第28张图片

 

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