顺序循环队列

队列:

    1、在一端插入在另一端删除

    2、先进先出  (First In First Out,FIFO)

    3、允许插入的一端为队尾,允许删除的一端为队头

循环队列:

      对于普通的顺序队列判空条件是front是否与rear相等且等于0,但出对时会出现向上溢出现象,这种溢出并不是真正的溢出,在数组中依然存在可以存放元素的空位置,所以是一种假溢出现象,为了解决这种现象我们可以把顺序队列想象成环状,当对首指针front = MAX_SIZE - 1后在前进一次就到0(对MAX_SIZE取余运算来实现)。

初始化:front = rear = 0;

入   队:rear = (rear + 1)  % MAX_SIZE;

出   对:front = (front + 1) % MAX_SIZE;

对   长:(rear - front + MAX_SIZE) % MAX_SIZE;

    但是这就有一个问题,队空与队满的判断条件都是front = rear,我们为了区分队空与队满我们可以专门用一个单元空间来判断(还有其他方法),既队头指针在队尾指针的下一个位置就代表队满。

队   满:(rear+ 1)% MAX_SIZE == front;

队   空:front == rear;

顺序循环队列_第1张图片

sqqueue.h

#ifndef SQQUEUE_H
#define SQQUEUE_H


#include 
#include 


#define MAX_SIZE 128


typedef struct
{
	char data[MAX_SIZE];
	int front;  //头
	int rear;	//尾
}Sqqueue;


void Init_Queue(Sqqueue * queue);
int Queue_Empty(Sqqueue queue);
int Queue_Length(Sqqueue * queue);
int Push(Sqqueue * queue,char ch);
int Pop(Sqqueue * queue,char *ch);



#endif


sqqueue.c

#include "sqqueue.h"


//初始化队列
void Init_Queue(Sqqueue * queue)
{
	queue->front = 0;
	queue->rear = 0;
	memset(queue,0,sizeof(queue->data));
}


//判空


int Queue_Empty(Sqqueue queue)
{
	return (queue.rear == queue.front ? 1 : 0); //空返回1
}


//求队列长度


int Queue_Length(Sqqueue * queue)
{
	return((queue->rear - queue->front + MAX_SIZE) % MAX_SIZE);
}


//入队
//入队成功返回1


int Push(Sqqueue * queue,char ch)
{
	if((queue->rear + 1) % MAX_SIZE == queue->front)
		return 0;
	queue->data[queue->rear] = ch;
	queue->rear = (queue->rear + 1) % MAX_SIZE;
	return 1;
}


//出队


int Pop(Sqqueue * queue,char *ch)
{
	if(queue->front == queue->rear)
		return 0;
	*ch = queue->data[queue->front];
	queue->front = (queue->front + 1) % MAX_SIZE;
	return 1;

}



main.c

#include "sqqueue.h"


Sqqueue * queue;
Sqqueue qu;
int main(void)
{
	int i;
	char ch;
	queue = &qu;
	Init_Queue(queue);
	printf("队列长度是:%d\n",Queue_Length(queue));
	if(Queue_Empty(*queue))
		printf("空队列\n");
	printf("请往队列里添加10个内容:\n");
	for(i = 0;i < 10;i++)
	{
		Push(queue,getchar());
	}
	while(!Queue_Empty(*queue))
	{
		if(Pop(queue,&ch))
			printf("出对数据是:%c\n",ch);
		printf("队列长度是:%d\n",Queue_Length(queue));
	}
	return 0;
}

你可能感兴趣的:(C语言)