循环队列
- 直接使用顺序存储,出现 Q.rear=MAXSIZE 时的上溢出
rear=队尾;front=对头的下一个元素
- 初始化:Q.front=Q.rear=0;
- 队首指针进1:Q.front=(Q.front+1)%MaxSize
- 队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
- 队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
- 顺时针方向出入队列
- 队满的处理: 牺牲一个存储单元来区别空和对满:对头指针在对尾指针的下一个位置,就是队满
- 队满: (Q.rear+1)%MaxSize == Q.front
- 对空:Q.front == Q.rear
- 队伍中的元素个数:(Q.rear-Q.front+MaxSize)%MaxSize
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include"time.h"
#define OK 1
#define ERROR 1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 //分配存储空间
typedef int Status;
typedef int QElemType;
typedef struct{
QElemType data[MAXSIZE];
int front; //头指针
int rear;// 尾指针
}SqQueue;
Status visit(QElemType c){
printf("%d ", c);
return OK;
}
/********************************/
Status InitQueue(SqQueue *Q){
Q->front=0;
Q->rear=0;
return OK;
}
Status ClearQueue(SqQueue *Q){
Q->front=Q->rear=0;
return OK;
}
// 若Q为空队列,返回true;否则返回false
Status QueueEmpty(SqQueue Q){
if(Q.front==Q.rear) // 队列空的标准
return TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
Status GetHead(SqQueue Q,QElemType *e){
if(Q.front==Q.rear) //队空
return ERROR;
*e=Q.data[Q.front];
return OK;
}
//队列未满,插入元素到队尾
Status EnQueue(SqQueue* Q, QElemType e){
if((Q->rear+1)%MAXSIZE==Q->front) // 对满的判断
return ERROR;
Q->data[Q->rear]=e; // e赋值给队尾
Q->rear=(Q->rear+1)%MAXSIZE;//rear指向最后一个位置
return OK;
}
//队列不空,出队列
Status DeQueue(SqQueue *Q,QElemType *e){
if(Q->front==Q->rear){ // 是否空
return ERROR;
}
* e=Q->data[Q->front];
Q->front=(Q->front+1)% MAXSIZE;
return OK;
}
Status QueueTraverse(SqQueue Q){
int i;
i=Q.front;
while((i+Q.front)!=Q.front){
visit(Q.data[i]);
i=(i+1)%MAXSIZE;
}
printf("\n");
return OK;
}
int main(){
SqQueue Q;
QElemType d;
InitQueue(&Q);
EnQueue(&Q,d);
DeQueue(&Q,&d);
return 0;
}