循环队列采用顺序存储的方式(数组),基本思想是通过一个数组存储数据,两个下标front和rear分别指向队头和队尾
由于假溢出现象:采用循环队列,又由于循环队列无法判断队列是空还是满,所以采用损失一个元素为空的代价来分别队列为空还是为满
与链队列不同的是:
循环队列的队头指针(下标)不是指向什么头结点,而是直接指向当前队头的元素
循环队列的队尾指针(下标)不是指向最后一个元素,而是指向最后一个元素的下一个下标
当循环队列为空的时候,队尾和队头下标均指向啊a[0]
循环队列的定义
一个数组存放数据,两个下标分别存放队头和队尾下标
typedef char DataType; typedef struct Queue{ DataType elem[MAXSIZE]; int front; int rear; }SeqQueue;
循环队列的初始化
队头下标和队尾下标均初始化为0
InitQueue(SeqQueue* Q) { Q->front=0; Q->rear=0; }
入队操作
先判断是否已满:条件:(Q->rear+1)%MAXSIZE==Q->front
以上为牺牲一个空间的例子
bool EnterQueue(SeqQueue* Q,DataType x) { if((Q->rear+1)%MAXSIZE==Q->front) { return false; } else { Q->elem[Q->rear]=x; Q->rear=(Q->rear+1)%MAXSIZE; return true; } }
出对操作
先判断是否为空:条件:Q->front==Q->rear
bool DeleteQueue(SeqQueue* Q,DataType* x) { if(Q->front==Q->rear) { return false; } else { *x=Q->elem[Q->front]; Q->front=(Q->front+1)%MAXSIZE; return true; } }