顺序循环队列的创建和基本应用

        顺序循环队列是队列里面使用比较广泛的一种队列,顺序队列在使用上方便,顺序队列对数据占用内存较小的程序来说是个不错的选择。

        顺序队列特点如下:

        1、顺序队列在存储结构上如下图所示

         要实现如上图所示的存储结构,我们需要在定义队列的结构体时在结构体内部定义两个指针来接收我们队列的对头指针Front的下标,以及队尾指针Rear的下标。(注:此处的指针并非真正的指针类型,而是数组数据对应的下标)即如下所示:

typedef int data_t;

typedef struct sequeue
{
	data_t buf[N];
	int front;//对头指针,指向出对元素的下标
	int rear;//队尾指针,指向最后一个元素的先下一个位置
}Sequeue;

        2、由于顺序队列是以数组的形式来存储数据的,因此我们在操作rear时,在第N个元素位置时rear会指向第N+1个元素,此时我们的数组下标发生了越界。所以在存储顺序循环队列数据时,需要保留第N位为空,也就是整个数组最多只能存放N-1个数据。

        接下来就是我们对这个队列的一些简单操作:

1、创建顺序循环队列的表头

Sequeue *create_sequeue()
{
	Sequeue *s = (Sequeue *)malloc(sizeof(Sequeue));
	if(NULL == s){
		printf("malloc is failed!\n");
		return NULL;
	}

	memset(s->buf, 0, sizeof(s->buf));

	s->front = s->rear = 0;//队列初始化只有表头一个元素,因此front和rear都指向第0位

	return s;
}

2、由于数组的存储容量存在上限,所以我们还需要对队列进行判满操作

//判断是否为满
int sequeue_is_full(Sequeue *s)
{
	if((s->rear+1)%N == s->front){//由于rear为N-1时下一个为元素下标为0,所以此处需要对N取余
		return 1;
	}
	return 0;
}

3、同样,后续数据处理时队列也需要进行判空操作

//判断是否为空
int sequeue_is_empty(Sequeue *s)
{
	if(s->rear == s->front){
		return 1;
	}
	return 0;
}

4、创建玩队列表头之后(队列为空),我们需要进行入队操作,即放入数据

//入队
void enqueue(Sequeue *s, data_t data)
{
	if(sequeue_is_full(s)){
		printf("FULL\n");
		return;
	}

	s->buf[s->rear] = data;
	s->rear = (s->rear+1)%N;//元素添加成功,对尾指针偏移一位
}

5、在队列元素存放完成之后,就是我们的出队操作

void dequeue(Sequeue *s, data_t *data)
{
	if(sequeue_is_empty(s)){
		printf("EMPTY\n");
		return;
	}
	
	*data = s->buf[s->front];
	s->front = (s->front+1)%N;//先进先出,因此操作对头指针逐个出队
}

以下为头文件的定义和主函数测试内容:

#ifndef _SEQUEUE_H
#define _SEQUEUE_H
#define N 100

typedef int data_t;

typedef struct sequeue
{
	data_t buf[N];
	int front;//对头指针,指向出对元素的下标
	int rear;//队尾指针,指向最后一个元素的先下一个位置
}Sequeue;

//创建循环队列
Sequeue *create_sequeue();

int sequeue_is_full(Sequeue *s);
int sequeue_is_empty(Sequeue *s);

//入队
void enqueue(Sequeue *s, data_t data);

void dequeue(Sequeue *s, data_t *data);

#endif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "sequeue.h"
#define N 100

int main(int argc, char *argv[])
{
	Sequeue *head = create_sequeue();

	if(sequeue_is_full(head)){
		printf("FULL\n");
	}

	if(sequeue_is_empty(head)){
		printf("EMPTY\n");
	}

	int n = 10;
	int data;
	while(n--){
		enqueue(head, n);
	}

	while(head->front != head->rear){
		dequeue(head, &data);
		printf("data = %d\n", data);
	}
	return 0;
}

接下来就是我们的代码测试环节啦!!!!!!

         代码中可见,我们是从9一直存到0,因此9最先存,0最后存,根据队列的原则来讲9会最先出队,0最后出队,从代码结构表明,我们的队列操作是正确的!!!

好的,以上即为本期内容,欢迎大家参考指正!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖尾猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值