数据结构:队列应用举例——报数问题

【问题描述】

设有 n n n 个人站成一排,从左向右的编号分别为 1 ∼ n 1\sim n 1∼n ,现在从左向右按照" 1 , 2 , 1 , 2 , ⋯ 1,2,1,2,\cdots 1,2,1,2,⋯" 报数,数到" 1 1 1"的人出列,数到" 2 2 2"的立即站到队伍的最右端。报数过程反复进行,直到 n n n 个人都出列为止。要求给出他们的出列顺序。

【分析】

根据问题描述,假设 n = 5 n=5 n=5 ,初始序列为: 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 ,如果用队列表示这个序列,则出列顺序为: 1 , 3 , 5 , 4 , 2 1,3,5,4,2 1,3,5,4,2 。

由于队列中有元素出队,队头指针会增 1,并且还有元素入队,队尾指针也增 1,如果采用顺序队,当初始空间设置的不是足够大(以 n = 5 n=5 n=5 为例,初始空间至少设置为 8),则会引起"假溢出",故应该使用循环队列作为本题中队列的数据结构。

【算法步骤】

  1. 出队一个元素,输出其编号(报数为 1 的人出列)
  2. 若队列不空,再出队一个元素,并将此元素从队尾入队(报数为 2 的"立即站到队伍的最右端,即入队)

【算法描述】

c 复制代码
//循环队列,即顺序队的存储结构
#define MAXQSIZE 100 //队列可能达到的最大长度

typedef struct{
    QElemType *base; //存储空间的基地址
    int front; //队头指针
    int rear;  //队尾指针
}SqQueue;

//循环队列的初始化
Status InitQueue(SqQueue * &Q){
    //构造一个空队列 Q
    Q.base = new QElemType[MAXQSIZE]; //为队列分配数组空间
    if(!Q.base) exit(OVERFLOW); //存储分配失败
    Q.front = Q.rear = 0; //头指针和尾指针置为零,队列为空
    return OK;
}

//循环队列的入队
status EnQueue(SqQueue * &Q, QElemType e){
    //插入元素 e 为 Q 的新的队尾元素
    if((Q.rear + 1) % MAXQSIZE == Q.front)//判断队满
        return ERROR;
    Q.base[Q.rear] = e; //新元素插入队尾
    Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针加 1
    return OK;
}

//循环队列的出队
Status DeQueue(SqQueue * &Q, QElemType &e){
    //删除 Q 的队头元素,用 e 返回其值
    if(Q.front == Q.rear) //队空 
        return ERROR;
    e = Q.base[Q.front]; //保存队头元素
    Q.front = (Q.front + 1) % MAXQSIZE; //队头指针加1
    return OK;
}

//判断是否队空
bool QueueEmpty(SqQueue * &Q){
    return Q.front == Q.rear;
}

//销毁队列
vodi DestroyQueue(SqQueue * &Q){
    free(Q);
}

//报数问题的函数
void number(int n){
    int i;
    ElemType e;
    SqQueue * Q; //循环队列指针 Q
    InitQueue(Q);
    for(i = 1; i <= n; i++) //构建初始序列
        EnQueue(Q, i);
    printf("报数出列顺序:");
    while(!QueueEmpty(Q)){ //队列不空
        DeQueue(Q, e); //出队报数 1 的人
        print("%d", e);
        if(!QueueEmpty(Q)){
            DeQueue(Q, e); //出队报数 2 的人
            EnQueue(Q, e); //将其入队
        }
    }
    print("/n");
    DestroyQueue(Q); //销毁队列 Q
}
相关推荐
liu****16 小时前
11.Linux进程信号(三)
linux·运维·服务器·数据结构·1024程序员节
AI科技星16 小时前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
MoRanzhi120319 小时前
Python 实现:从数学模型到完整控制台版《2048》游戏
数据结构·python·算法·游戏·数学建模·矩阵·2048
2401_8414956419 小时前
【数据结构】基于BF算法的树种病毒检测
java·数据结构·c++·python·算法·字符串·模式匹配
一只鱼^_20 小时前
力扣第 474 场周赛
数据结构·算法·leetcode·贪心算法·逻辑回归·深度优先·启发式算法
叫我龙翔20 小时前
【数据结构】从零开始认识图论 --- 单源/多源最短路算法
数据结构·算法·图论
ysa05103021 小时前
虚拟位置映射(标签鸽
数据结构·c++·笔记·算法
Yue丶越21 小时前
【C语言】深入理解指针(二)
c语言·开发语言·数据结构·算法·排序算法
程序员东岸1 天前
数据结构杂谈:双向链表避坑指南
数据结构·链表
Shinom1ya_1 天前
算法 day 46
数据结构·算法