|
使用循环队列,避免出现伪满队列的情况
- 判断队列为空的条件:rear == front;
- 判断队列为满的条件:(rear+1)%MAXSIZE == front;
空出一个数组元素空间,用以区别开来满队列和空队列。
一个顺序队列的结构:
typedef struct{
// 定义一个数组用来存储所有的数据元素
Element data[MAXSIZE];
// 第一个元素下标
int front;
// 最后一个元素的下标
int rear;
}SqQueue;
对顺序队列的操作:
// 初始化一个线性表
SqQueue* InitSQueue(){
SqQueue *sq = (SqQueue *)malloc(sizeof(SqQueue));
if(!sq){
exit(0);
}
sq->front = 0;
sq->rear = 0;
return sq;
}
// 判断是否为空的队列
bool SQueueEmpty(SqQueue *sq){
return sq->rear == sq->front;
}
// 是否为满的队列
bool SQueueFull(SqQueue *sq){
return (sq->rear+1)%MAXSIZE == sq->front;
}
Status EnSQueue(SqQueue *sq,Element v){
// 判断队列是否已满
if(SQueueFull(sq)){
return ERROR;
}
// 进队列,插入数据后队尾指针后移
sq->data[sq->rear] = v;
sq->rear = ++sq->rear%MAXSIZE;
return OK;
}
Status DeSQueue(SqQueue *sq,Element *v){
// 判断队列是否是空队列
if(SQueueEmpty(sq)){
return ERROR;
}
// 出队列,取出数据后队头指针后移
*v = sq->data[sq->front];
sq->front = ++sq->front%MAXSIZE;
return OK;
}
// 打印队列
void PrintSQueue(SqQueue *sq){
if(!SQueueEmpty(sq)){
printf("栈内的元素依次是:[");
for (int i = sq->front; i!=sq->rear; i = (i+1)%MAXSIZE) {
printf("%d",sq->data[i]);
if((i+1)%MAXSIZE != sq->rear){
printf(", ");
}
}
printf("]\n");
}
}
测试代码:
int TestSQueue(){
SqQueue *sq = InitSQueue();
SQueueCreate(sq,5);
Element a;
Element *resP;
resP = &a;
DeSQueue(sq,resP);
printf("%d 元素出队列\n",*resP);
EnSQueue(sq,5);
printf("元素入队列\n");
DeSQueue(sq,resP);
printf("%d 元素出队列\n",*resP);
DeSQueue(sq,resP);
printf("%d 元素出队列\n",*resP);
EnSQueue(sq,6);
printf("元素入队列\n");
EnSQueue(sq,7);
printf("元素入队列\n");
DeSQueue(sq,resP);
printf("%d 元素出队列\n",*resP);
PrintSQueue(sq);
return 0;
}
运行结果:

|