线性结构的应用-队列

作者: 黄一倚 | 来源:发表于2018-07-27 17:10 被阅读0次

定义

  • 队列和栈一样,也是一种操作受限的线性表
  • 只允许在表的前端(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;
}

相关文章

  • 线性结构的应用-队列

    定义 队列和栈一样,也是一种操作受限的线性表 只允许在表的前端(front)进行删除操作,而在表的后端(rear)...

  • 大话数据结构 - 链表

    代码GitHub地址 链表概述 数组和链表都是线性存储结构的基础实现,栈和队列都是线性存储结构的应用 数组优缺点 ...

  • Ⅱ. 栈和队列

    栈和队列都是线性结构,可以用线性表在某种条件下来完成栈和队列的操作 1. 栈 : 先进后出的线性表 应用 : 常见...

  • 数据结构与算法掌握这些就够了

    数据结构 线性结构数组、链表、栈、队列 非线性多维数组、树、图 1. 栈 后进先出,可以处理递归调用实际应用:字符...

  • 2019-05-14*(线性结构 和 非线性结构的分类)

    线性结构: 百度百科:线性结构是一个有序数据元素的[集合]常用的线性结构有:线性表,栈,队列,双队列,数组,串。 ...

  • Java数据结构和算法概览

    Java数据结构和算法概览 数据结构 线性数据结构:常见的有一维数组,线性表,栈,队列,双队列,串。 非线性数据结...

  • 栈和队列

    栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表。 栈 栈(Stack):...

  • Java链表

    一、链表介绍 数组和链表都是最基础的线性数据结构,可以用来实现栈,队列等非线性,有特定应用场景的数据结构。数组作为...

  • MQ(message queue)

    是什么? 1.什么是队列? 队列是一种先进先出的数据结构。 数据结构 线性数据结构:常用的:线性表、栈、队列、串等...

  • 数据结构(线性结构 栈与队列)

    栈与队列都是特殊的线性表,它们也是线性结构。用户可以采用顺序存储结构和链式存储结构两种方式来存储。栈和队列结构是各...

网友评论

    本文标题:线性结构的应用-队列

    本文链接:https://www.haomeiwen.com/subject/chygmftx.html