当前位置: 首页 > news >正文

数据结构之队列

队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。

队列有下面几个操作:

  • InitQueue()   ——初始化队列
  • EnQueue()        ——进队列
  • DeQueue()        ——出队列
  • IsQueueEmpty()——判断队列是否为空
  • IsQueueFull()    ——判断队列是否已满

队列可以由数组和链表两种形式实现队列操作(c语言),下面仅以数组为例:

数组实现:

队列数据结构

复制代码
typedef struct queue
{
        int queuesize;   //数组的大小
        int head, tail;  //队列的头和尾下标
        int *q;          //数组头指针
}Queue;
复制代码

InitQueue()   ——初始化队列

复制代码
void InitQueue(Queue *Q)
{
        Q->queuesize = 8;
        Q->q = (int *)malloc(sizeof(int) * Q->queuesize); //分配内存
        Q->tail = 0;
        Q->head = 0;
}
复制代码

这样有个缺陷,空间利用率不高。采用循环队列:

 

EnQueue()        ——进队列

复制代码
void EnQueue(Queue *Q, int key)
{
        int tail = (Q->tail+1) % Q->queuesize; //取余保证,当quil=queuesize-1时,再转回0
        if (tail == Q->head)                   //此时队列没有空间
        {
            printf("the queue has been filled full!");
        }
        else
        {
            Q->q[Q->tail] = key;
            Q->tail = tail;
        }
}
复制代码

DeQueue()        ——出队列

复制代码
int DeQueue(Queue *Q)
{
        int tmp;
        if(Q->tail == Q->head)     //判断队列不为空
        {
            printf("the queue is NULL\n");
        }
        else
        {
            tmp = Q->q[q->head];
            Q->head = (Q->head+1) % Q->queuesize;
        }
        return tmp;
}
复制代码

IsQueueEmpty()——判断队列是否为空

复制代码
int IsQueueEmpty(Queue *Q)
{
        if(Q->head == Q->tail)
        {
            return 1;
        }
        else
        {
            return 0;
        }
}
复制代码

IsQueueFull()——判断队列是否已满

复制代码
int IsQueueFull(Queue *Q)
{
    if((Q->tail+1)% Q->queuesize == Q->head)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
复制代码

转载于:https://www.cnblogs.com/Ph-one/p/6396265.html

相关文章:

  • 数据结构基础知识(2)
  • 软考之操作系统(1)
  • 高效编程之互斥锁和自旋锁的一些知识
  • 信号量,互斥锁,自旋锁
  • 全双工和半双工
  • spi和I2c的速率
  • 以太网接口
  • 变量分类
  • C语言8大经典排序算法(1)
  • C语言8大经典排序算法(2)
  • O(n²)、O(n)、O(1)、O(nlogn)
  • tcp与socket关系
  • linux怎么区别文本文件和二进制文件
  • Linux下的文件及文件后缀名
  • CCT之CAMERA TUNNING调试学习总结
  • 《剑指offer》分解让复杂问题更简单
  • 【React系列】如何构建React应用程序
  • ES6核心特性
  • Fabric架构演变之路
  • httpie使用详解
  • Java IO学习笔记一
  • Java|序列化异常StreamCorruptedException的解决方法
  • js数组之filter
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • React+TypeScript入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue.js框架原理浅析
  • Vue--数据传输
  • 多线程事务回滚
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 嵌入式文件系统
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 学习Vue.js的五个小例子
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • (007)XHTML文档之标题——h1~h6
  • (02)vite环境变量配置
  • (2)nginx 安装、启停
  • (libusb) usb口自动刷新
  • (力扣题库)跳跃游戏II(c++)
  • (六)激光线扫描-三维重建
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)RocketMQ初步认识
  • (转)c++ std::pair 与 std::make
  • (转)jQuery 基础
  • (转)Oracle存储过程编写经验和优化措施
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net流程开发平台的一些难点(1)
  • /proc/stat文件详解(翻译)
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Pointcut 使用
  • @我的前任是个极品 微博分析
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题