基于C语言的循环队列实现(包含完整代码)

循环队列不同于非循环队列和链表,其操作不需要定义next指针,只是单纯的定义一个固定的结构体变量,此结构体中的数组变量已经可以包含全部的已定义的队列长度.(如果采用循环链表来实现队列也可行,但队列会成为可变长的)

首先需要两个头文件#include <stdio.h>和#include <stdlib.h>

1.定义结构体

typedef struct Queue //定义结构体 
{
	int data[MAXSIZE];//表示结构体的长度 
	int front;//队列头 
	int rear;//队列尾 
}Queue;

2.初始化队列

Queue *initQueue()
{
	Queue *Q = (Queue *)malloc(sizeof(Queue));//申请空间 
	Q->front = 0;//新的队列初试没有元素,因此队头和队尾都是0 
	Q->rear = 0;
	return Q;
}

3.判满

int isFULL(Queue *Q)
{
	if((Q->rear+1)%MAXSIZE==Q->front)//为了和空队进行区别 
		return 1;
	else
		return 0;
}

4.入队

int enQueue(Queue *Q,int data)
{
	if(isFULL(Q))//先判断队列是否为满 
		return 0;
	else
	{
		Q->data[Q->rear] = data;//将元素写入data数组中,具体写在那里看队尾 
		Q->rear = (Q->rear+1)%MAXSIZE;//除以MAXSIZE是防止溢出 
		return 1;
	}
}

5.判空

int isEmpty(Queue *Q)
{
	if(Q->front==Q->rear)//与上面的判满做区别 
		return 0;
	else
		return 1;
}

6.出队

int deQueue(Queue *Q)
{
    if(isEmpty(Q))//队列不空 
    {
        int data = Q->data[Q->front];//将要出队的元素暂存到data中,最后返回 
        Q->front = (Q->front+1)%MAXSIZE;//出队要看队头,出队后队头向后移,为防止溢出除以MAXSIZE 
        return data;
    }
    else
        return -1;
}

7.遍历输出

void printQueue(Queue *Q)
{
	int i;
	int length = (Q->rear-Q->front+MAXSIZE)%MAXSIZE;//首先要求队列中元素的个数 
	int index = Q->front;//定义一个变量表示需要打印的元素的位置(会移动) 
	for(i=0;i<length;i++)//循环输出 
	{
		printf("%d ",Q->data[index]);
		index = (index+1)%MAXSIZE;//除以MAXSIZE防止溢出 
	}
	printf("\n");
}

8.主函数验证

int main()
{
	Queue *Q = initQueue();//初始化队列 
	int i,data;
	for(i=0;i<5;i++)
		enQueue(Q,i);//验证入队 
	printQueue(Q);//验证遍历输出 
	data = deQueue(Q);//验证出队 
	printQueue(Q);
	printf("%d\n",data);
	return 0;
}

----------------------------完整代码如下-------------------------------

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5 //定义循环队列的长度为5 
typedef struct Queue //定义结构体 
{
    int data[MAXSIZE];//表示结构体的长度 
    int front;//队列头 
    int rear;//队列尾 
}Queue;
/*初始化队列*/
Queue *initQueue()
{
    Queue *Q = (Queue *)malloc(sizeof(Queue));//申请空间 
    Q->front = 0;//新的队列初试没有元素,因此队头和队尾都是0 
    Q->rear = 0;
    return Q;
}
/*判满*/
int isFULL(Queue *Q)
{
    if((Q->rear+1)%MAXSIZE==Q->front)//为了和空队进行区别 
        return 1;
    else
        return 0;
}
/*入队*/
int enQueue(Queue *Q,int data)
{
    if(isFULL(Q))//先判断队列是否为满 
        return 0;
    else
    {
        Q->data[Q->rear] = data;//将元素写入data数组中,具体写在那里看队尾 
        Q->rear = (Q->rear+1)%MAXSIZE;//除以MAXSIZE是防止溢出 
        return 1;
    }
}
/*判空*/
int isEmpty(Queue *Q)
{
    if(Q->front==Q->rear)//与上面的判满做区别 
        return 0;
    else
        return 1;
}
/*出队*/
int deQueue(Queue *Q)
{
    if(isEmpty(Q))//队列不空 
    {
        int data = Q->data[Q->front];//将要出队的元素暂存到data中,最后返回 
        Q->front = (Q->front+1)%MAXSIZE;//出队要看队头,出队后队头向后移,为防止溢出除以MAXSIZE 
        return data;
    }
    else
        return -1;
}
/*遍历输出*/
void printQueue(Queue *Q)
{
    int i;
    int length = (Q->rear-Q->front+MAXSIZE)%MAXSIZE;//首先要求队列中元素的个数 
    int index = Q->front;//定义一个变量表示需要打印的元素的位置(会移动) 
    for(i=0;i<length;i++)//循环输出 
    {
        printf("%d ",Q->data[index]);
        index = (index+1)%MAXSIZE;//除以MAXSIZE防止溢出 
    }
    printf("\n");
}
int main()
{
    Queue *Q = initQueue();//初始化队列 
    int i,data;
    for(i=0;i<5;i++)
        enQueue(Q,i);//验证入队 
    printQueue(Q);//验证遍历输出 
    data = deQueue(Q);//验证出队 
    printQueue(Q);
    printf("%d\n",data);
    return 0;
}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值