队列是一种操作受限的顺序表(只能在队头删除,在队尾插入)。
所以依旧使用静态数组的形式去存储队列。
(1)创建(初始化)
现定于(顺序队列)的结构体
初始化队列时:
主函数中声明一个队列:
那么判断队列是否为空:
(2)入队操作(增):
把要插入的元素插入到队尾指针指向的位置
然后将队尾指针往后移动一格。
这就完成了一次入队操作。
那么这里的队列已满的条件是什么呢?
当整个静态数组都被存满之后:
其实是不可以的。
当我们让队头元素依次出列的时候。
rear依旧等于Maxsize
静态数组的前面的位置
是不是空余了
所以我们对原有的入队操作进行修改。
使rear指针重新指向前面空闲的位置
模运算这就实现了将存储空间在逻辑上变成了“环状”
我们将这样实现的队列称为循环队列
此时我们看到rear上面还有存储空间;
我们就可以进行后移。
此时队列已满的条件:队尾指针的在下一个位置是队头即:(Q.rear+1)%MaxSize==Q.front
也许有人会问,不是还有一个空位置吗。为什么不让front=rear呢?
我们记得判断队空的条件是:front=rear(会混淆)
所以代价就是牺牲一个存储单元。
循环队列的出队操作:(从front出来)
rear=front的时候,就是队列已经为空了(return false)
(4)查找
方案一:判断队列已满/已空
那么如何对队列元素的个数:
方案二:
我们在结构体中再定义一个size
方案三(同时满足两个条件)
一定要注意审题:(队尾指针是指向什么位置)