数据结构 队列 queue C语言 排队 报数

本文深入探讨了循环队列的定义与基本操作,包括初始化、判空、判满、入队、出队等,并通过具体实例展示了如何利用循环队列解决特定问题,如模拟报数出列过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环队列的基本操作:初始化队列、判队列为空、判队列为满、出队列、入队列等运算。
该程序的功能是实现循环队列的定义和操作。

#define MAXQSIZE  100  //最大队列长度
  typedef struct
 { QElemType  *base;  // 动态分配存储空间
    int  front;     // 头指针,若队列不空,指向队列头元素
    int  rear;      // 尾指针,若队列不空,指向队列尾元素 的下一个位置
} SqQueue;

1、 构造一个空队列Q
2、 插入元素e为Q的新的队尾元素
3、 若队列不空,则删除Q的队头元素,用e返回其值,否则返回ERROR
4、 若队列不空,则取队首元素,用e返回其值
5、 判断队列是否为空
6、 判断队列是否为满
引用上述操作的应用
(1)问题描述
设有n个人排成一列,从前往后“0,1”连续报数。凡是报到“0”的人出列,凡是报到“1”的人立即站到队伍的最后。反复进行报数,直到所有人均出列为止。要求给出这n个人的出列顺序。
例如,n=5时,初始序列为1、2、3、4、5,
出队序列为1、3、5、4、2

// 循环队列.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef int QElemType;
typedef int Status;

#define MAXQSIZE 100

#define OK 1
#define ERROR 0
#define OVERFLOW 0
//author: 小柳学渣
typedef struct
{
	QElemType *base;
	int front;
	int rear;
}SqQueue;
//author: 小柳学渣
/*构造*/
Status InitQueue(SqQueue &Q)
{
	Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));
	if (!Q.base)
	{
		printf("存储分配失败");
		system("pause");
		exit(OVERFLOW);
	}
	Q.front = Q.rear = 0;
	return OK;
}

/*长度*/
Status QueueLength(SqQueue &Q)
{
	return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

/*插入*/
Status EnQueue(SqQueue &Q, QElemType e)
{
	if ((Q.rear + 1) % MAXQSIZE == Q.front)
	{
		printf("队列满");
		system("pause");
		exit(OVERFLOW);
	}
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXQSIZE;
	return OK;
}

/*删除*/
Status DeQueue(SqQueue &Q, QElemType &e)
{
	if (Q.front == Q.rear)
	{
		printf("队列为空");
		system("pause");
		return ERROR;
	}
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXQSIZE;
	return OK;
}

/*判断是否为空*/
Status QueueEmpty(SqQueue &Q)
{
	if (Q.rear == Q.front)
		return 1;
	else
		return 0;
}

/*判断是否为满*/
Status QueueFull(SqQueue &Q)
{
	if (Q.front == (Q.rear + 1)% MAXQSIZE)
		return 1;
	else
		return 0;
}


//author: 小柳学渣
/*(1)问题描述
设有n个人排成一列,从前往后“0,1”连续报数。凡是报到“0”的人出列,凡是报到“1”的人立即站到队伍的最后。反复进行报数,直到所有人均出列为止。要求给出这n个人的出列顺序。
例如,n=5时,初始序列为1、2、3、4、5,
          出队序列为1、3、5、4、2*/
Status QueueA(SqQueue &Q)
{//author: 小柳学渣
	int x, y, n;
	printf("Input n:");
	scanf_s("%d", &n);
	for (int i = 1; i <= n; i++)
		EnQueue(Q, i);
	while (!QueueEmpty(Q))
	{
		DeQueue(Q, x);
		printf("%d ", x);
		if (!QueueEmpty(Q))
		{
			DeQueue(Q, y);
			EnQueue(Q, y);
		}
	}
    printf(“\n”);
	return OK;
}
//author: 小柳学渣
int main()
{
	SqQueue Q;
	InitQueue(Q);
	QueueA(Q);
	return 0;
}

循环队列的定义及基本操作:初始化队列、判队列为空、判队列为满、出队列、入队列等运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小柳学渣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值