线性结构的应用-队列

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

目录
相关文章
|
7月前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
74 0
|
7月前
|
C++
数据结构01-线性结构-链表栈队列-栈篇
数据结构01-线性结构-链表栈队列-栈篇
|
4月前
【数据结构】用栈实现队列
【数据结构】用栈实现队列
|
7月前
|
存储 数据安全/隐私保护 C++
数据结构01-线性结构-链表栈队列-队列篇
数据结构01-线性结构-链表栈队列-队列篇
|
Java
线性结构-队列
线性结构-队列
4011 0
线性结构-队列
|
存储
基础数据结构-线性表-栈-队列(上)
基础数据结构-线性表-栈-队列
75 0
|
存储 缓存
基础数据结构-线性表-栈-队列(下)
基础数据结构-线性表-栈-队列
68 0
|
存储 缓存 算法
【数据结构】队列(循环队列和链队列)详细讲解各种操作
【数据结构】队列(循环队列和链队列)详细讲解各种操作
920 0
|
存储 C语言
【数据结构】队列详解 && 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列
【数据结构】队列详解 && 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列
136 0
【数据结构】队列详解 && 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列
|
存储 索引
【数据结构】—— 队列(有序队列及环形队列的数组实现)
【数据结构】—— 队列(有序队列及环形队列的数组实现)
207 0
【数据结构】—— 队列(有序队列及环形队列的数组实现)