• 循环队列实现


           生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题

    一、循环队列的基础知识

    1.循环队列需要几个参数来确定

             循环队列需要2个参数,front和rear

    2.循环队列各个参数的含义

    (1)队列初始化时,front和rear值都为零;

    (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

    (3)当队列为空时,front与rear的值相等,但不一定为零;

    3.循环队列入队的伪算法

    (1)把值存在rear所在的位置;

    (2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;

    4.循环队列出队的伪算法

    (1)先保存出队的值;

    (2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;

    5.如何判断循环队列是否为空

    if(front==rear)

          队列空;

    else

         队列不空;

    6.如何判断循环队列是否为满

          这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

    解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

    /*!
     * file 循环队列.cpp
     *
     * author ranjiewen
     * date 2017/02/25 20:23
     *
     * 循环队列用数组实现,达到内存利用好
     */
    
    #include<stdio.h>
    #include<stdlib.h>
    #include "malloc.h"
    
    #define  N  8
    
    typedef struct queue
    {
        int *pBase;  // 数组头指针
        int front;   //指向队列第一个元素
        int rear;    //指向队列的最后一个元素的下一个元素
        int maxsize;
        struct queue(){ pBase = nullptr, front = rear = maxsize = 0; }
    }Queque,*LinkQueque;  
    
    
    void CreateQueque(LinkQueque Q,int maxsize);
    void TraverseQueque(LinkQueque Q);
    bool FullQueque(LinkQueque Q);
    bool EmptyQueque(LinkQueque Q);
    bool EnQueque(LinkQueque Q, int val);
    bool DeQueque(LinkQueque Q,int *val);
    
    
    int main()
    {
        Queque q; 
        LinkQueque Q=&q;    //初始化变量
        CreateQueque(Q, N);
        for (int i = 1; i <= 6;i++)
        {
            EnQueque(Q, i);
        }
        TraverseQueque(Q);
        EnQueque(Q, 10);
        if (FullQueque(Q))
        {
            TraverseQueque(Q);
            printf("满队列...
    ");
        }
        int del_data=0;
        if (DeQueque(Q,&del_data))
        {
            printf("出队列成功,数值为:%d
    ", del_data);
        }
        TraverseQueque(Q);
    
        return 0;
    }
    
    void CreateQueque(LinkQueque Q, int maxsize)
    {
        Q->pBase = (int*)malloc(sizeof(int)*maxsize);
        if (Q->pBase==nullptr)
        {
            printf("Memory allocation failure...");
            exit(-1);
        }
        Q->front = 0; //初始化参数
        Q->rear = 0;
        Q->maxsize = maxsize;
    }
    
    void TraverseQueque(LinkQueque Q)
    {
        int i = Q->front;
        printf("队列中的元素为:
    ");
        while (i%Q->maxsize!=Q->rear)
        {
            printf("%d ", Q->pBase[i]);
            i=(i+1)%Q->maxsize;
        }
        printf("
    ");
    }
    
    bool FullQueque(LinkQueque Q)
    {
        if (Q->front == (Q->rear + 1) % Q->maxsize)    //判断循环链表是否满,留一个预留空间不用
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool EmptyQueque(LinkQueque Q)
    {
        if (Q->rear==Q->front)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool EnQueque(LinkQueque Q, int val)
    {
        if (FullQueque(Q))
        {
            return false;
        }
        else
        {
            Q->pBase[Q->rear] = val;
            Q->rear = (Q->rear + 1) % Q->maxsize;
            return true;
        }
    }
    
    bool DeQueque(LinkQueque Q, int *val)
    {
        if (EmptyQueque(Q))
        {
            return false;
        }
        else
        {
            *val = Q->pBase[Q->front];
            Q->front = (Q->front + 1) % Q->maxsize;
            return true;
        }
    }

    测试结果:

    数据结构:循环队列(C语言实现)

  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/6442696.html
Copyright © 2020-2023  润新知