zoukankan      html  css  js  c++  java
  • 循环队列

        循环队列结构如下:

    #define QUEUE_MAXSIZE 100
    #define ERROR           0
    #define OK              1
    #define OVERFLOW       -1
    
    typedef int Status;
    typedef int QElemType;
    typedef struct
    {
        QElemType *data;
        int front;
        int rear;
    }SqQueue;

        下面是具体实现:

    //初始化时,队头队尾皆为空
    //当加入元素后,front指向队头的位置
    //rear指向队尾的下一个元素位置 
    void InitQueue(SqQueue *Q)
    {
        assert(Q);
    
        Q->data = (QElemType *)malloc(sizeof(QElemType)*QUEUE_MAXSIZE);
        if (!Q->data)
            exit(OVERFLOW);
    
        Q->front = Q->rear = 0;
    }
    
    void DestroyQueue(SqQueue *Q)
    {
        assert(Q);
    
        free(Q->data);
        Q->data=NULL;
        Q->front = Q->rear = 0;
    }
    
    void ClearQueue(SqQueue *Q)
    {
        assert(Q);
    
        Q->front = Q->rear = 0;
    }
    
    Status QueueEmpty(SqQueue *Q)
    {
        assert(Q);
    
        return Q->front == Q->rear;
    }
    
    int QueueLength(SqQueue *Q)
    {
        assert(Q);
    
        return (QUEUE_MAXSIZE + Q->rear - Q->front) % QUEUE_MAXSIZE;
    }
    
    Status EnQueue(SqQueue *Q, QElemType e)
    {
        assert(Q);
    //为了区分循环队列空和满的区别,要求队列满的状态有
    //QUEUE_MAXSIZE-1个元素,而不是QUEUE_MAXSIZE个元素 
    //当然,也可以最队列结构里设置一个标志,来区分满和空
        if ((Q->rear + 1) % QUEUE_MAXSIZE == Q->front)
            return ERROR;
    
        Q->data[Q->rear] = e;
        Q->rear = (Q->rear + 1) % QUEUE_MAXSIZE;
    
        return OK;
    }
    
    Status DeQueue(SqQueue *Q, QElemType *e)
    {
        assert(Q);
    
        if (Q->rear == Q->front)
            return ERROR;
    
        if (e)
            *e = Q->data[Q->front];
        Q->front = (Q->front + 1) % QUEUE_MAXSIZE;
    
        return OK;
    }
    
    Status GetHead(SqQueue *Q,QElemType *e)
    {
        assert(Q&&e);
        
        if(QueueEmpty(Q))
            return ERROR;
        
        *e=Q->data[Q->front];
        return OK;
    }
    
    void QueueTraverse(SqQueue *Q, void(*visit)(QElemType *))
    {
    assert(Q&&visit);
    int tmp = Q->front; while (tmp != Q->rear) { visit(Q->data + tmp); tmp = (tmp + 1) % QUEUE_MAXSIZE; } }

        下面是测试程序:

    
    

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

    int main()
    {
        SqQueue Q;
        int n = 90;
    
        InitQueue(&Q);
    
        while (n--)
            EnQueue(&Q, n);
    
        while (!QueueEmpty(&Q))
        {
            DeQueue(&Q, &n);
            printf("%d ", n);
        }
    
        system("pause");
        return 0;
    }

        运行结果:

  • 相关阅读:
    谷歌将用QUIC传输层技术加速互联网
    无人自助洗车机漏洞
    什么是区块链,为什么它越来越受欢迎
    域名Whois数据和隐私是最大风险
    什么原因?全球许多网络提供商推迟部署IPv6
    FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
    C#中读写INI配置文件
    C#读取和导出EXCEL类库(可操作多个SHEET)
    Javascript刷新页面的几种方法
    用C#抓取AJAX页面的内容
  • 原文地址:https://www.cnblogs.com/inori/p/5025310.html
Copyright © 2011-2022 走看看