数据结构-队列

1.队列的概念

        队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。

允许插入的一端称为队尾rear,允许删除的一端称为队头(front)

2.顺序队列

#define N 14

typedef int datatype;

typedef struct

{

        datatype data[N];//存放队列元素

        Int front;//队头

        Int rear;//队尾

}

初始状态(队空条件):Q->front == Q->rear == 0
进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。
出队操作:队不空时,先取队头元素值,再将队头指针加1。

3.循环队列

我们把队列的这种头尾相接的顺序存储结构称为循环队列。
当队首指针Q->front = N-1后,再前进一个位置就自动到0,这可以利用除法取余运算(%)来实现。

初始时:Q->front = Q->rear=0。

队首指针进1:Q->front = (Q->front + 1) %N

队尾指针进1:Q->rear = (Q->rear + 1) % N

队列长度:(Q->rear - Q->front + N) %N

队满条件: (Q->rear + 1)%N == Q->front

队空条件仍: Q->front == Q->rear

队列中元素的个数: (Q->rear - Q ->front + N)% N

创建

sequeue *queue_create()
{
	sequeue *q;
	q = (sequeue*)malloc(sizeof(sequeue));
	if(q == NULL)
	{
		printf("malloc failed\n");
		return NULL;
	}
	memset(q->data,0,sizeof(q->data));//数组清0
	q->front = q->rear = 0;//初始化队头和队尾
	return q;
	
}

清空

int queue_clear(sequeue *q)
{
	if(q == NULL)
	{
		printf("q is NULL\n");
		return -1;
	}
	q->front = q->rear = 0;
}

判空

int queue_empty(sequeue *q)
{
	if(q == NULL)
	{
		printf("q is NULL\n");
		return -1;
	}
	return ((q->front == q->rear ? 1 : 0));//判断队头和队尾是否相等
}

判满

int queue_full(sequeue *q)
{
	if((q->rear+1) % N == q->front)//判断队列是否满了
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

入队

int enqueue(sequeue *q,data_t x)
{
	if(q == NULL)
	{
		printf("q is NULL\n");
		return -1;
	}
	if((q->rear+1) % N == q->front)
	{
		printf("q is full\n");
		return -1;
	}
	q->data[q->rear] = x;//入队
	q->rear = (q->rear+1) % N;//队尾更新
}

出队

data_t dequeue(sequeue *q)
{
	data_t ret;
	ret = q->data[q->front];
	q->front = (q->front+1) % N;
	return ret;
}

销毁

sequeue *queue_free(sequeue *q)
{
	if(q == NULL)
	{
		printf("q is NULL\n");
		return NULL;
	}
	free(q);
	q = NULL;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值