/*
    顺序表队列
    初始化
    入队列
    出队列
    取队列头数据
    计算队列有效长度
*/

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

#define QElemType unsigned int

typedef struct __QueueInfo{
    int *data;
    QElemType front;
    QElemType rear;
    unsigned int capacity;
}QueueInfo;

/* 初始化 */
int initQueue(QueueInfo **ppQ, unsigned int size)
{
    if (NULL == ppQ)
    {
        printf("Queue point address is not exist,error\n");
        return -1;
    }

if (1 > size)
    {
        printf("initQueue length: %d, error\n", size);
        return -1;
    }
    
    QueueInfo *pNewQueue = (QueueInfo *)malloc(sizeof(QueueInfo));
    if (NULL == pNewQueue)
    {
        printf("initQueue malloc error\n");
        return -1;
    }
    
    pNewQueue->data = (int *)malloc(sizeof(int)*size);
    if (NULL == pNewQueue->data)
    {
        printf("initQueue databuf malloc error\n");
        return -1;
    }
    pNewQueue->capacity = size;
    pNewQueue->front = pNewQueue->rear = 0;
    *ppQ = pNewQueue;
    
    return 0;
}

/* 入队列 */
int pushQueue(QueueInfo *pQ, int val)
{
    if (NULL == pQ)
    {
        printf("Queue is NULL\n");
        return -1;
    }

if ((pQ->rear + 1)%pQ->capacity == pQ->front)
    {
        printf("Queue Full\n");
        return -1;
    }
    pQ->data[pQ->rear] = val;
    pQ->rear = (pQ->rear +1)%pQ->capacity;
    
    return 0;
}

/* 出队列 */
int popQueue(QueueInfo *pQ, int *val)
{
    if (NULL == pQ)
    {
        printf("Queue NULL\n");
        return -1;
    }

if (pQ->rear == pQ->front)
    {
        printf("Queue empty\n");
        return -1;
    }
    
    *val = pQ->data[pQ->front];
    pQ->front = (pQ->front + 1)%pQ->capacity;
    
    return 0;
}

/* 取队列头数据 */
int queueFront(QueueInfo *pQ, int *val)
{
    if (NULL == pQ)
    {
        printf("Queue is NULL\n");
        return -1;
    }
    
    *val = pQ->data[pQ->front];

return 0;
}

/* 计算队列有效数据长度 */
int queueCapacity(QueueInfo *pQ, unsigned int *size)
{
    if (NULL == pQ)
    {
        printf("Queue is NULL\n");
        return -1;
    }
    
    if (pQ->front <= pQ->rear)
    {
        *size = pQ->rear - pQ->front;
    }
    else
    {
        *size = pQ->capacity - pQ->front + pQ->rear;
    }
    
    return 0;
}
/* 测试程序入口 */
int main(void)
{
    QueueInfo *pQueue = NULL;
    int printValue = 0;
    unsigned int sizeOfQueue = 0;
    /* 队列项为10 */
    initQueue(&pQueue, 10);
    /* 连续push11次,检测是否会提示出错 */
    for (int i=0; i<11; i++)
    {
        printValue = 0;
        sizeOfQueue = 0;

pushQueue(pQueue, i);

queueCapacity(pQueue, &sizeOfQueue);
        printf("pQueue capacity: %u\n", sizeOfQueue);

queueFront(pQueue, &printValue);
        printf("pQueue front value: %d\n", printValue);
    }
    /* 连续pop11次,检测是否会提示出错 */
    for (int i=0; i<11; i++)
    {
        printValue = 0;
        sizeOfQueue = 0;

queueCapacity(pQueue, &sizeOfQueue);
        printf("pQueue capacity: %u\n", sizeOfQueue);

queueFront(pQueue, &printValue);
        printf("pQueue front value: %d\n", printValue);

popQueue(pQueue, &printValue);
        printf("pQueue pop value: %d\n", printValue);
    }
    
    free(pQueue);

return 0;
}

转载于:https://www.cnblogs.com/tedani/p/9989122.html

顺序表循环队列:创建初始化、入队、出队、获取队列头数据、计算队列有效数据长度...相关推荐

  1. 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include using namespace std; #define MAXSI ...

  2. 队列的入队/出队操作

    //............编程实现队列的入队/出队操作 (先进先出) #include<iostream> using namespace std; //node表示队列中每个节点元素 ...

  3. 顺序队和循环队列,队列篇(顺序队和循环队列入队出队操作)

    数据结构专升本学习,队列篇(顺序队和循环队列) 前言: 之前我们把栈学完了,比较简单,今天我们学习队列里面的顺序队和循环队列,说难不难,说简单不简单,我们需要认真学习,博主会尽力把原理和逻辑讲明白,不 ...

  4. 简单实现顺序表示的栈与队列的进栈出栈创空栈入队出队创空队等算法

    栈和队列是两种最重要的数据结构,也是两种最典型的抽象数据类型,应用非常的广泛. 目录 一.栈 一.空栈的创建 二.进栈 三.出栈 二.队列 一.创建空队列 二.队列的入队和出队 三.取队列头元素 一. ...

  5. java循环队列入队出队算法_循环队列实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

  6. redis + php 简单的 队列 入队-出队

    //入队 操作<?php //链接redis $redis = new Redis(); $redis->connect("127.0.0.1","6379& ...

  7. 5-1链队入队出队操作

    链队基本操作. #include<iostream> using namespace std;#define OK 1 #define ERROR 0 typedef int Status ...

  8. 【Android UI】Canvas 画布 ① ( Canvas 状态栈 | Canvas 状态栈入栈与出栈 | 获取 Canvas 状态栈容量 | Canvas 状态栈原点数据 )

    文章目录 一.Canvas 状态栈入栈与出栈 二.获取 Canvas 状态栈容量 三.Canvas 状态栈原点数据 Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ...

  9. 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

    队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...

最新文章

  1. usaco Shaping Regions
  2. Filezilla 二进制上传设定
  3. linux时间戳截止,给定一个Unix时间戳,如何得到那一天的开始和结束?
  4. PXE大批量安装Linux系统
  5. 深度学习入门之感知器(原理+代码)
  6. 八、“看夕阳西下,烂漫秋霞”
  7. Image:介绍一些跟图片有关的控件,如图片展示特效,图片生产,图片保护等
  8. 开始使用 Markdown
  9. 点广告才可以下载的代码
  10. 实现一个简易的教师管理系统(一)
  11. 灌篮高手全国大赛漫画 (23-31卷) + 十日后
  12. 【FusionCompute】基于FreeNAS部署并使用虚拟存储(五)
  13. RTNETLINK answers: File exists的解决方案
  14. smartbi连接mysql数据库_数据源连接 - Smartbi V7 帮助中心 - Smartbi 在线知识中心
  15. 奔驰c260语言设置方法图解,奔驰C260L灯光使用方法,C260L灯光开关图解说明
  16. 在matlab中数据波动指标,阶跃响应指标的matlab计算
  17. 如何添加Google统计在自己的网站
  18. bzoj1375 双调路径
  19. Allegro加密文件密码破解和解除读写导出限制
  20. 软件配置管理(一)配置管理概念与目标

热门文章

  1. [原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - 从SD卡内读取图片文件,然后显示在TFT-LCD上...
  2. php api数据,php API查询数据
  3. CSS 伪类与伪元素
  4. HTML中DIV与SPAN的区别
  5. Targan 算法[有向图强连通分量]
  6. linux中的file命令
  7. C#之windows桌面软件第二课:向单片机发信息的串口工具
  8. 口语学习Day8:今天聊聊微信有关的英语总结!
  9. C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
  10. mybaits四-2:模糊查询