数据结构与算法分析(C语言描述) -- 学习&理解 队列

1、队列基础知识

队列中的插入添加操作称为入队(enqueue),删除操作称为出队(dequeue);队列有队头与队尾,类似于排队结账的队伍一样;可以利用数组来实现队列这个数据结构,当然也可以用链表实现;

2、队列的实现

2.1 队列的数组实现

定义一个数组,数组大小固定,那么队列需要判断队列是否为空和队列是否已满;对于队列已满的操作,可以将rear(后部)再绕回指向队列起始位置,此操作方式又称为循环队列;循环队列操作需要注意的是:判断队列是否为空很重要,如果dequeue一个空队列,得到的是一个未知的元素;

- front - a[2] - a[3] - a[4] - rear -

代码示例:

#include <stdio.h>
#include <stdlib.h>

#define QUEUE_MAX_SIZE 10

struct Queue
{
	int cap;
	int front;
	int rear;
	int size;
	int *arry;
};

void creat_queue(struct Queue *new_queue, int queue_size)
{
	new_queue->cap = queue_size;
	new_queue->size = 0;
	new_queue->front = 0;
	new_queue->rear = 1;
	new_queue->arry = (int *)calloc(0, queue_size);

	if (new_queue->arry == NULL)
	{
		printf("creat new queue failed !\n");
	}
}

int queue_is_empty(struct Queue *queue)
{
	return queue->size == 0;
}

int queue_is_full(struct Queue *queue)
{
	return queue->size == queue->cap;
}

void queue_make_empty(struct Queue *queue)
{
	queue->size = 0;
	queue->front = 1;
	queue->rear = 0;
}

int queue_enqueue(int element, struct Queue *queue)
{
	if (queue_is_full(queue))
	{
		printf("queue is full !\n");
		return -1;
	}

	queue->size++;

	if (++queue->rear == queue->cap)
	{
		queue->rear = 0;
	}
	
	queue->arry[queue->rear] = element;

	printf("enqueue %d\n", element);

	return 0;
}

int queue_dequeue(struct Queue *queue)
{
	if (queue_is_empty(queue))
	{
		printf("queue is empty !\n");
		return -1;
	}

	queue->size--;

	if (++queue->front == queue->cap)
	{
		queue->front = 0;
	}

	printf("dequeue %d\n", queue->arry[queue->front]);
	
	return queue->arry[queue->front];
}

int main(void)
{
	struct Queue queue;
	int i;

	creat_queue(&queue, QUEUE_MAX_SIZE);

	for (i = 0; i < QUEUE_MAX_SIZE; i++)
	{
		queue_enqueue(i, &queue);
	}

	for (i = 0; i < QUEUE_MAX_SIZE; i++)
	{
		queue_dequeue(&queue);
	}

	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值