在非空队列里,队首指针始终指向队头元素,而队尾指针始终指向队尾元素的下一位置。
顺序队列中存在“假溢出”现象。因为在入队和出队操作中,头、尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际元素个数可能远远小于数组大小,但可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假溢出。如下图所示是数组大小为5的顺序队列中队首、队尾指针和队列中元素的变化情况
为了解决假溢出问题,采用循环队列,看下图
入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,无法通过front=rear来判断队列“空”还是“满”。解决此问题的方法是:约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满。
即rear所指的单元始终为空。
判断是否队满(入队操作尾指针)
(q.rear+1)%MAX == q.front
q.rear = (q.rear+1)%MAX
判断是否队空(出队操作头指针)
q.front==q.rear
q.front = (q.front+1)%MAX
#include <iostream>
using namespace std;
#define MAX 5
//循环队列
struct Queue{
int data[MAX];
int front;//队首指针
int rear;//队尾指针
};
//初始化队列
void init(Queue &q){
q.front = q.rear = 0;
}
//判断是否空
int isEmpty(Queue q){
return q.front==q.rear;//0不是空
}
//入队
void enQueue(Queue &q, int ele){
if( (q.rear+1)%MAX == q.front ){//牺牲掉一个空间
cout<<"队满---\n";
return ;
}
q.data[q.rear] = ele;
q.rear = (q.rear+1)%MAX;
}
//出队
void deQueue(Queue &q, int &num){
if(isEmpty(q)){//判断是否为空 W
cout<<"队列为空---";
return ;
}
num = q.data[q.front];
q.front = (q.front+1)%MAX;
}
int main(){
Queue q;
init(q);
/*
牺牲掉一个空间判断是否队满
所以元素最多是 MAX-1个
*/
for(int i=0; i<5; i++){
enQueue(q,6);
}
for(int i=1; i<=5; i++){
int num=0;
deQueue(q,num);
cout<<num<<" ";
}
return 0;
}
来源:CSDN
作者:Dr_W
链接:https://blog.csdn.net/qq_42363032/article/details/103825079