线性表7:队列的顺序存储——顺序队列


从数据结构角度看,栈和队列也是线性表,只不过是操作受限的线性表。

队列:操作限制在两端的线性表,一端进行插入操作,称为队尾;另一端进行删除操作,称为队头。

顺序队列,又称之为循环队列,将队列循环处理,是为避免假溢出。下文的顺序队列都代表循环队列。
假溢出现象:队列里明明是有空间,但是不能再进行入队操作。

1.队列的特点

先进先出(FIFO)
存储:顺序存储、链式存储

2.顺序队列的描述

**描述:**数组+front指针+rear指针
front保存队头的前一个位置,rear保存队尾的下标

#define MAXSIZE 100

typedef int datatype;
typedef struct 
{
	datatype data[MAXSIZE];
	int front;//始终指向队首的前一个位置
	int rear;//始终指向队尾
}sequeue;

3.基本操作

3.1创建空顺序队列

在这里插入图片描述

sequeue * createSeQueue()
{
	//1.申请空间
	sequeue * Q = (sequeue *)malloc(sizeof(sequeue));
	if(NULL == Q)
	{
		printf("create: malloc fail\n");
		return NULL;
	}

	//2.初始化
	Q->front = Q->rear = MAXSIZE-1;

	return Q;
}

3.2判空

int isEmptySeQueue(sequeue * Q)
{
	return (Q->front == Q->rear)?1:0;
}

3.3判满

在这里插入图片描述

int isFullSeQueue(sequeue * Q)
{
	return ((Q->rear+1)%MAXSIZE == Q->front)?1:0;
}

3.4入队

int inSeQueue(sequeue * Q, datatype x)
{
	//非满则入队
	if(isFullSeQueue(Q))
	{
		printf("队列已满\n");
		return -1;
	}

	//入队操作rear
	Q->rear = (Q->rear+1)%MAXSIZE;
	Q->data[Q->rear] = x;

	return 0;
}

3.5出队

int OutSeQueue(sequeue * Q, datatype *x)
{
	//非空则出队
	if(isEmptySeQueue(Q))
	{
		printf("队列是空\n");
		return -1;
	}

	//出队操作front
	Q->front = (Q->front+1)%MAXSIZE;
	*x = Q->data[Q->front];

	return 0;
}

3.6打印输出

在这里插入图片描述

void showSeQueue(sequeue * Q)
{
	int i = 0;
	for(i = (Q->front+1)%MAXSIZE; i != (Q->rear+1)%MAXSIZE; i = (i+1)%MAXSIZE)
	{
		printf("%d ", Q->data[i]);
	}
	printf("\n");
}

测试

	int i;
	sequeue * Q = createSeQueue();
	if(NULL == Q)
		return -1;

	for(i = 0; i < 10; i++)
	{
		if(!isFullSeQueue(Q))
			inSeQueue(Q, i);
	}
#if 0	//测试出队
	datatype x;
	while(!isEmptySeQueue(Q))
	{
		OutSeQueue(Q, &x);
		printf("%d ", x);
	}
	printf("\n");
#endif

	showSeQueue(Q);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值