C语言实现循环队列基本操作

循环队列依靠取模运算,实现队列中数据元素的逻辑成环操作。其相比队列的顺序存储实现,可以避免“假溢出”的问题。

头文件声明

#include <stdio.h>

#include <stdlib.h>

/*

* 循环队列实现

*/

//数据元素上限

#define MaxSize 50

//定义数据类型

typedef int ElemType;

/*结构体定义*/

typedef struct SqQueue

{

ElemType data[MaxSize];//数组-存放数据元素

int front, //队头指针

rear; //队尾指针

}SqQueue;

//初始化队列

void InitQueue(SqQueue *q);

//判断队列是否为空

int EmptyQueue(SqQueue q);

//入队操作

int EnQueue(SqQueue *q,ElemType e);

//出队操作

int DeQueue(SqQueue *q,ElemType* e);

//获取队列长度

int LengthQueue(SqQueue q);

//获取队头元素

void GetHead(SqQueue q,ElemType* e);

//打印队列

void printSqQueue(SqQueue q);

函数实现

#include "SqQueue.h"

/**

* 循环队列函数实现

*/

//初始化队列

void InitQueue(SqQueue *q){

//队头指针-队尾指针,同时指向队首元素

q->front=q->rear=0;

}

//判断队列是否为空

int EmptyQueue(SqQueue q){

//队头指针和队尾指针指向同一个元素,则为空队列

return q.front==q.rear;

}

//入队操作

int EnQueue(SqQueue *q,ElemType e){

//判断是否队满

if ((q->rear+1)%MaxSize==q->rear)

return -1;

//入队操作

q->data[q->rear]=e;//添加数据元素-将队尾元素值置为e

q->rear=(q->rear+1)%MaxSize;//尾指针向前移动,队尾指针++

return 1;

}

//出队操作

int DeQueue(SqQueue *q,ElemType* e){

//判断是否队空

if ((q->rear+1)%MaxSize==q->front)

return -1;

//保存数据

*e=q->data[q->front];

//出队操作

q->front=(q->front+1)%MaxSize;

return 1;

}

//获取队列长度

int LengthQueue(SqQueue q){

return (q.rear-q.front+MaxSize)%MaxSize;

}

//获取队头元素

void GetHead(SqQueue q,ElemType* e){

//判断队列是否为空

if (q.front==q.rear)

return;

//获取队头元素的值

*e=q.data[q.front];

}

//打印队列

void printSqQueue(SqQueue q){

//辅助指针

int pIndex;

//打印队列元素

pIndex=q.front;

while (pIndex<q.rear)

{

printf("%4d",q.data[pIndex++]);

}

printf("\n");

}

函数测试

#include "SqQueue.h"

int main(int argc,char** argv){

//声明队列

SqQueue sQueue;

int i;

ElemType data;

//初始化队列

InitQueue(&sQueue);

//获取队头指针和队尾指针的值

printf("frontVal=%d,rearVal=%d\n",sQueue.front,sQueue.rear);

//判断队列是否为空

printf("is Empty?%d\n",EmptyQueue(sQueue));

//入队操作

for (i=0;i<20;i++)

{

EnQueue(&sQueue,i+1);

}

//判断队列是否为空&获取队列长度

printf("is Empty?%d,len=%d\n",EmptyQueue(sQueue),LengthQueue(sQueue));

//打印队列元素

printSqQueue(sQueue);

//出队操作

DeQueue(&sQueue,&data);

printf("the aimed value is %d\n",data);

//判断队列是否为空&获取队列长度

printf("is Empty?%d,len=%d\n",EmptyQueue(sQueue),LengthQueue(sQueue));

//打印队列元素

printSqQueue(sQueue);

//获取队头元素值

GetHead(sQueue,&data);

printf("the head value is %d\n",data);

return 0;

}

再贴个测试结果的图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C语言实现循环队列基本操作 的全部内容, 来源链接: utcz.com/p/247228.html

回到顶部