线性结构的应用-队列

简介: 定义队列和栈一样,也是一种操作受限的线性表只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作进行插入操作的端称为队尾,进行删除操作的端称为队头特性先进先出(FIFO—first in first out):...

定义

  • 队列和栈一样,也是一种操作受限的线性表
  • 只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作
  • 进行插入操作的端称为队尾,进行删除操作的端称为队头

特性

  • 先进先出(FIFO—first in first out):最早进入队列的元素最先从队列中删除

分类

静态队列:用数组实现
动态队列:用链表实现

用数组实现循环队列

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

typedef struct Queue{
    int* pBase;
    int qFront;
    int qRear;
}QUEUE;

/**
    函数声明
*/
void init_queue(QUEUE *); //初始化一个队列
bool en_queue(QUEUE * pQueue,int element); //向队列插入一个元素
void traverse_queue(QUEUE *);   //遍历一个队列
bool isFull(QUEUE *);   //判断队列是否满
bool isEmpty(QUEUE *);  //判断队列是否为空
bool out_queue(QUEUE *,int *); //出队

int main()
{
    QUEUE Q;
    //测试 初始化队列
    init_queue(&Q);

    //测试 入队
    en_queue(&Q,1);
    en_queue(&Q,2);
    en_queue(&Q,3);
    en_queue(&Q,4);
    en_queue(&Q,5);
    //插入失败,队列已满
    en_queue(&Q,6);
    en_queue(&Q,7);

    //测试 遍历队列
    traverse_queue(&Q);

    //测试 出队
    int element;
    if(out_queue(&Q,&element)){
        printf("出队成功,出队的元素是:%d\n",element);
    }else{
        printf("出队失败!\n");
    }
    traverse_queue(&Q);

    return 0;
}

/**
    初始化一个队列
*/
void init_queue(QUEUE * pQueue){
    //生成一个数组,并把首地址赋给pBase
    pQueue->pBase = (int *)malloc(sizeof(int)*6);

    //初始化前后位置
    pQueue->qFront=0;
    pQueue->qRear=0;

    return;
}

/**
    判断队列是否满
*/
bool isFull(QUEUE *pQueue){
    //队列预留一个空存储空间,如果队尾指针加一取余数组长度 等于 队头指针,则队列为满
    //(pQueue->qFront+1)%6 == pQueue->qRear 这样写是错误的
    if((pQueue->qRear+1)%6 == pQueue->qFront)
        return true;
    else
        return false;
}

/**
    入队
*/
bool en_queue(QUEUE * pQueue,int element){
    if(isFull(pQueue))
        return false;

    //插入元素
    pQueue->pBase[pQueue->qRear]=element;
    //队尾指针指向下一个存储单元
    pQueue->qRear = (pQueue->qRear + 1)%6;

    return true;
}

/**
    遍历一个队列
*/
void traverse_queue(QUEUE * pQueue){
    int i = pQueue->qFront;
    //从队头开始遍历,如果遍历指针 等于 队尾指针,则遍历完成
    while(i != pQueue->qRear){
        printf("%d\t",pQueue->pBase[i]);
        i = (i+1)%6;
    }
    printf("\n");

    return;
}

/**
    判断队列是否空
*/
bool isEmpty(QUEUE *pQueue){
    //当头尾指针指向同一个元素的时候,队列为空
    if(pQueue->qFront == pQueue->qRear)
        return true;
    else
        return false;
}

/**
    出队
*/
bool out_queue(QUEUE *pQueue,int *pElement){
    if(isEmpty(pQueue))
        return false;
    //保存要删除的元素
    *pElement = pQueue->pBase[pQueue->qFront];
    //队头指针向后移
    pQueue->qFront = (pQueue->qFront+1)%6;

    return true;
}

目录
相关文章
|
存储 数据采集 数据挖掘
“湖仓一体架构及其应用”写作框架,系统架构设计师
随着5G、大数据、人工智能、物联网等技术的不断成熟,各行各业的业务场景日益复杂,企业数据呈现出大规模、多样性的特点,特别是非结构化数据呈现出爆发式增长趋势。在这一背景下,企业数据管理不再局限于传统的结构化OLTP(On-Line Transaction Processing)数据交易过程,而是提出了多样化、异质性数据的实时处理要求。传统的数据湖(Data Lake)在事务一致性及实时处理方面有所欠缺,而数据仓库(Data Warehouse)也无法应对高并发、多数据类型的处理。因此,支持事务一致性、提供高并发实时处理及分析能力的湖仓一体(Lake House)架构应运而生。湖仓一体架构在成本、
306 2
|
机器学习/深度学习 分布式计算 数据处理
什么是 Apache Spark?
【8月更文挑战第31天】
404 0
|
Java 网络架构 数据格式
Struts 2 携手 RESTful:颠覆传统,重塑Web服务新纪元的史诗级组合!
【8月更文挑战第31天】《Struts 2 与 RESTful 设计:构建现代 Web 服务》介绍如何结合 Struts 2 框架与 RESTful 设计理念,构建高效、可扩展的 Web 服务。Struts 2 的 REST 插件提供简洁的 API 和约定,使开发者能快速创建符合 REST 规范的服务接口。通过在 `struts.xml` 中配置 `&lt;rest&gt;` 命名空间并使用注解如 `@Action`、`@GET` 等,可轻松定义服务路径及 HTTP 方法。
158 0
|
机器人 数据中心
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
|
人工智能 运维 Serverless
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
375 0
|
存储 消息中间件 SQL
快手 Flink 的稳定性和功能性扩展
快手技术专家刘建刚,在 Flink Forward Asia 2022 生产实践专场的分享。
7246 3
快手 Flink 的稳定性和功能性扩展
|
Web App开发 编解码 Android开发
音视频全栈开发,挑战年薪突破40W+
音视频全栈开发,挑战年薪突破40W+
|
安全 数据建模 网络安全
探索常见的SSL证书类型及其应用场景
探索常见的SSL证书类型及其应用场景
352 0
|
机器学习/深度学习 传感器 安全
【信道容量】基于QPSK+8PSK+16PSK+16QAM数字信号调制信道容量仿真附Matlab代码
【信道容量】基于QPSK+8PSK+16PSK+16QAM数字信号调制信道容量仿真附Matlab代码

热门文章

最新文章