QA2

简介: 本示例演示循环队列的FIFO操作,通过front、rear和count指针变化展示入队、出队过程,直观呈现队列状态与数据流动,帮助理解队列的工作原理及边界处理。

=== 队列 FIFO 演示(显示 front/rear/count)===
队列容量: 4

▶ 入队 5
队列数据: [5, 0, 0, 0]
队列状态: [5] (队头→队尾)
front=0, rear=1, count=1

▶ 入队 7
队列数据: [5, 7, 0, 0]
队列状态: [5, 7] (队头→队尾)
front=0, rear=2, count=2

▶ 入队 9
队列数据: [5, 7, 9, 0]
队列状态: [5, 7, 9] (队头→队尾)
front=0, rear=3, count=3

▶ 出队
出队元素: 5
队列数据: [5, 7, 9, 0]
队列状态: [7, 9] (队头→队尾)
front=1, rear=3, count=2

▶ 出队
出队元素: 7
队列数据: [5, 7, 9, 0]
队列状态: [9] (队头→队尾)
front=2, rear=3, count=1

▶ 入队 6
队列数据: [5, 7, 9, 6]
队列状态: [9, 6] (队头→队尾)
front=2, rear=0, count=2

▶ 出队
出队元素: 9
队列数据: [5, 7, 9, 6]
队列状态: [6] (队头→队尾)
front=3, rear=0, count=1

▶ 入队 8
队列数据: [8, 7, 9, 6]
队列状态: [6, 8] (队头→队尾)
front=3, rear=1, count=2

▶ 出队
出队元素: 6
队列数据: [8, 7, 9, 6]
队列状态: [8] (队头→队尾)
front=0, rear=1, count=1

▶ 出队
出队元素: 8
队列数据: [8, 7, 9, 6]
队列状态: 空
front=1, rear=1, count=0

▶ 入队 5
队列数据: [8, 5, 9, 6]
队列状态: [5] (队头→队尾)
front=1, rear=2, count=1

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 4

// 队列存储
int queue_data[MAX_SIZE];
int front = 0;      // 队头索引
int rear = 0;       // 队尾索引
int count = 0;      // 元素个数

// 全局变量:用于 dequeue 返回值(避免指针)
int global_dequeued_value = 0;

// 初始化队列
void initQueue() {
   
    front = 0;
    rear = 0;
    count = 0;
}

// 判断队列是否为空
bool isEmpty() {
   
    return count == 0;
}

// 判断队列是否已满
bool isFull() {
   
    return count == MAX_SIZE;
}

// 入队
bool enqueue(int value) {
   
    if (isFull()) {
   
        printf("【警告】队列已满,无法入队 %d!\n", value);
        return false;
    }
    queue_data[rear] = value;
    rear = (rear + 1) % MAX_SIZE;
    count++;
    return true;
}

// 出队(通过全局变量返回值)
bool dequeue() {
   
    if (isEmpty()) {
   
        printf("【警告】队列为空,无法出队!\n");
        return false;
    }
    global_dequeued_value = queue_data[front];
    front = (front + 1) % MAX_SIZE;
    count--;
    return true;
}

// 获取最后一次出队的值
int getLastDequeuedValue() {
   
    return global_dequeued_value;
}

// 打印队列内容 + 内部状态 (front, rear, count)
void printQueue() {
   
    printf("  队列数据: [");
    for (int i = 0; i < MAX_SIZE; i++) {
   
        if (i > 0) printf(", ");
        printf("%d", queue_data[i]);
    }
    printf("]\n");

    if (isEmpty()) {
   
        printf("  队列状态: 空\n");
    } else {
   
        printf("  队列状态: [");
        int i = front;
        for (int j = 0; j < count; j++) {
   
            printf("%d", queue_data[i]);
            if (j < count - 1) printf(", ");
            i = (i + 1) % MAX_SIZE;
        }
        printf("] (队头→队尾)\n");
    }
    printf("  front=%d, rear=%d, count=%d\n", front, rear, count);
}

// 主函数:演示先进先出(FIFO)
int main() {
   
    initQueue();

    printf("=== 队列 FIFO 演示(显示 front/rear/count)===\n");
    printf("队列容量: %d\n\n", MAX_SIZE);

    // 入队 5, 7, 9
    printf("▶ 入队 5\n");
    enqueue(5);
    printQueue();

    printf("\n▶ 入队 7\n");
    enqueue(7);
    printQueue();

    printf("\n▶ 入队 9\n");
    enqueue(9);
    printQueue();

    // 出队
    printf("\n▶ 出队\n");
    if (dequeue()) {
   
        printf("  出队元素: %d\n", getLastDequeuedValue());
        printQueue();
    }

    printf("\n▶ 出队\n");
    if (dequeue()) {
   
        printf("  出队元素: %d\n", getLastDequeuedValue());
        printQueue();
    }

    // 入队 6
    printf("\n▶ 入队 6\n");
    enqueue(6);
    printQueue();

    // 出队
    printf("\n▶ 出队\n");
    if (dequeue()) {
   
        printf("  出队元素: %d\n", getLastDequeuedValue());
        printQueue();
    }

    // 入队 8
    printf("\n▶ 入队 8\n");
    enqueue(8);
    printQueue();

    // 连续出队
    printf("\n▶ 出队\n");
    if (dequeue()) {
   
        printf("  出队元素: %d\n", getLastDequeuedValue());
        printQueue();
    }

    printf("\n▶ 出队\n");
    if (dequeue()) {
   
        printf("  出队元素: %d\n", getLastDequeuedValue());
        printQueue();
    }

    // 最后入队 5
    printf("\n▶ 入队 5\n");
    enqueue(5);
    printQueue();

    return 0;
}
相关文章
|
11月前
QA1
该程序使用栈检测算术表达式中括号是否匹配。支持圆括号、方括号和花括号,检查配对与嵌套顺序,输入以#结束,输出匹配结果或错误信息。
451 5
|
11月前
|
JavaScript 前端开发 物联网
Node.js
Node.js:将JavaScript从浏览器带入服务端的革命性运行时,凭借事件驱动、非阻塞I/O模型,重塑高性能服务器开发。它打破全栈壁垒,催生庞大生态,推动实时应用与微服务发展,成为连接过去与未来的技术桥梁。(238字)
940 137
|
11月前
QA3
该程序使用双栈(数字栈和运算符栈)实现算术表达式求值,支持加减乘除、乘方及括号运算。通过优先级控制运算顺序,最终输出计算结果。
324 67
|
11月前
|
监控 Java 数据库连接
《深入理解Spring》事务管理——数据一致性的守护者
Spring事务管理确保数据一致性,支持声明式与编程式两种方式。通过@Transactional注解简化配置,提供传播行为、隔离级别、回滚规则等灵活控制,结合ACID特性保障业务逻辑可靠执行。
|
前端开发 Java C++
JUC系列之《CompletableFuture:Java异步编程的终极武器》
本文深入解析Java 8引入的CompletableFuture,对比传统Future的局限,详解其非阻塞回调、链式编排、多任务组合及异常处理等核心功能,结合实战示例展示异步编程的最佳实践,助你构建高效、响应式的Java应用。
|
11月前
|
运维 小程序 搜索推荐
小程序制作平台哪个好?小程序开发工具推荐
在数字化浪潮席卷的当下,小程序凭借其便捷性、易用性和强大的功能,成为企业拓展业务、提升用户体验的重要工具。然而,选择合适的小程序开发模式,是确保项目成功的关键所在。目前,主流的小程序开发模式主要有自主开发、利用SaaS小程序制作平台开发以及外包开发这三种。它们在成本投入、开发周期、控制力度和灵活性等方面各有优劣,适用于不同发展阶段和类型的企业。接下来,我们将对这三种模式进行详细剖析。
1404 16
|
11月前
|
缓存 监控 Java
《深入理解Spring》性能监控与优化——构建高性能应用的艺术
本文系统介绍了Spring生态下的性能监控与优化实践,涵盖监控体系构建、数据库调优、缓存策略、线程池配置及性能测试等内容,强调通过数据驱动、分层优化和持续迭代提升应用性能。
|
11月前
|
人工智能 编解码 算法
《3D植被建模痛点解决:开放世界层级实例化+GPU批处理优化方案》
本文记录开放世界生存游戏“迷雾森林”场景3D植被建模的技术攻坚过程。初期因静态烘焙方案,出现近景纹理拉伸、中景阴影脱节、显存过载闪退等问题,后转向“动态层级实例化”,按空间、模型、材质三维度拆分植被资源,搭建层级参数库。面对实例化数量过载,通过材质分组批处理与GPU实例化优化,将Draw Call从3200次降至210次,帧率回升至58帧。后续开发动态环境响应模块,实现植被随天气调整形态,并优化地形采样算法解决穿模悬浮问题。最终沉淀“四维协同”建模逻辑,还探索AI辅助LOD生成,为开放世界3D资产开发提供可复用路径。
659 6
|
11月前
|
算法 NoSQL 关系型数据库
《聊聊分布式》分布式系统核心概念
分布式系统由多节点协同工作,突破单机瓶颈,提升可用性与扩展性。CAP定理指出一致性、可用性、分区容错性三者不可兼得,BASE理论通过基本可用、软状态、最终一致性实现工程平衡,共识算法如Raft保障数据一致与系统可靠。
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1628 0