c语言实现顺序循环队列

队列

队列简称队,是一种操作受限的线性表,限制在于仅允许在表的一段进行插入操作,而在表的另一端进行删除操作。
进行插入的一段叫做队尾,进行删除的一端叫做队首,队又称作先入先出表。

c语言实现顺序循环队列_第1张图片
队列到顺序表的映射如图:
c语言实现顺序循环队列_第2张图片
采用顺序储存结构的队列称为顺序队。注意在学习线性表的时候,要充分掌握表的上下界,在操作某个位置时,搞清楚其下标。
队列类型声明如下;

typedef struct
{
	Elemtype data[MAXSIZE];//存放队中元素
	int front,rear;//队头和队尾位置
}SQQueue;

队列的主要操作有入队和出队:
enQueue(&q,e);//进队列,将元素e作为队尾元素

deQueue (&q,&e);//出队列,从队列中出队一个元素,并将其值赋给e

循环队列

前面的队列操作中,进队时队尾位置rear增1,元素出队时,队头位置front增1,当rear==MAXSIZE-1时,表示此时队列满了(上溢出),不能再进队元素。实际上此时队列中可能还会有空位置,把这种情况通常称为假溢出。
于是我们把数组视为一个头尾相接的循环结构,即数组的下标的最大位置延续到下标最小的位置,从逻辑上视为一个环,称为循环队列。
于是当rear=MAXsize-1时,再前进一个就到达0,就可以用另一端的空位置来存放队列元素了。实际上存储器的地址总是连续标号的,为此采用数学上的取余操作(%)来实现:
front=(front+1)%MAXSIZE
rear=(rear+1)%MAXSIZE
下面用代码来实现顺序循环队列:
运行环境:Vs2017
代码:

#include 
#include


#define MAXSIZE 10


typedef int Elemtype;//把int设置别名Elemtype
/*建立顺序队类型*/
typedef struct
{
	Elemtype data[MAXSIZE];//存放队中元素
	int front;//队头
	int rear;//队尾
}SqQueue;


/*初始化队列*/
void InitQueue(SqQueue *&q)//传入参数为队列类型的引用,可以对传入的队列进行直接修改
{
	q = (SqQueue*)malloc(sizeof(SqQueue));
	q->front = q->rear = 0;//把队头和队尾设置为初始状态
}

/*销毁队列*/
void Distroy(SqQueue *&q)
{
	free(q);
}

/*判空操作*/
bool Empty(SqQueue *q)
{
	return(q->front == q->rear);
}

/*进队列操作*/
int enQueue(SqQueue *&q,Elemtype x)//x参数为要进队的数据
{
	if ((q->rear+1)%MAXSIZE == q->front)//先判断是否队q为满
	{
		return 0;
	}
	q->rear=(q->rear+1)%MAXSIZE;
	q->data[q->rear] = x;//赋值
	return 1;
}

/*出队列操作*/
int deQueue(SqQueue *&q, Elemtype &ptr)//通过ptr引用返回值
{
	if ((q->rear + 1) % MAXSIZE == q->front)//判断队q是否为满
	{
		return 0;
	}
	q->front=(q->front+1)%MAXSIZE;//队头+1
	ptr = q->data[q->front];
	return 1;
}





int main()
{
	system("pause");
	return 0;
}

你可能感兴趣的:(数据结构)