在顺序队列中,由于数组空间不够而产生的溢出叫真溢出;
顺序队列因多次入队列和出队列操作后出现的有存储空间但不能进行入队列操作的溢出称为假溢出(因为入队和出队后,rear值和front值逐渐变大,最开始的位置为空但无法入队)
假溢出是由于队尾rear的值和队头front的值不能由所定义数组下界值自动转为数组上界值而产生的,解决的办法是把顺序队列所使用的存储空间构造成一个逻辑上首尾相连的循环队列。
和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应设置为0。
解决方法:使用循环队列
牺牲一个单元来区分队空和队满,也是普遍在利用的方式。
队满:(rear + 1)% QueueSize == front(因为会发生进位,跟闹钟过12一样进行处理)
队空:front == rear
队长:(rear - front + QueueSize)% QueueSize
#include<iostream>
using namespace std;
#define MaxSize 100
typedef struct{
int data[MaxSize];
int front = 0,rear = 0;
}SqQueue;
//判满
bool QueueFull(SqQueue Q){
return (Q.rear + 1)% MaxSize == Q.front;
}
//判空
bool QueueEmpty(SqQueue Q){
return Q.front == Q.rear;
}
//进队
bool EnQueue(SqQueue &Q,int x){
if(QueueFull(Q)) return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1)% MaxSize;
return true;
}
//出队
bool DeQueue(SqQueue &Q,int& x){
if(QueueEmpty(Q)) return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1)% MaxSize;
return true;
}
//队大小
int QueueSize(SqQueue Q){
return (Q.rear - Q.front + MaxSize)% MaxSize;
}
int main(){
SqQueue q;
cout<<QueueEmpty(q)<<endl;
EnQueue(q,1);
cout<<QueueEmpty(q)<<endl;
int x = 0;
DeQueue(q,x);
cout<<x<<endl;
cout<<QueueEmpty(q);
}