• 数组实现循环队列


    队列有两种形式:链式队列和静态队列,静态队列一般用数组实现,数组的优点是集中存储,内存访问快,若是用数组实现,一定是循环队列,否则会造成巨大的内存浪费。

    应用场景:限流、排队

    C语言:

    //
    // Created by zhanghaodong on 2019-02-15.
    //
    /**
     * 循环队列
     */
    #include <stdio.h>
    
    #define MAXSIZE 10
    #define OK 1
    #define ERROR -1
    
    typedef int Status;
    
    typedef int QElemType;
    
    typedef struct {
        QElemType data[MAXSIZE];
        int front;/*头指针*/
        int rear;/*尾指针,指向最后一个*/
        int size;
    
    } SqQueue;
    
    Status initQueue(SqQueue *q) {
        q->front = 0;
        q->rear = 0;
        q->size = 0;
        return OK;
    }
    
    
    int queueLen(SqQueue *q) {
        return q->size;
    }
    
    Status enQueue(SqQueue *q, QElemType e) {
        /*队列满了*/
        if (q->size == MAXSIZE) {
            return ERROR;
        }
        if (q->size > 0) {
            q->rear = (q->rear + 1) % MAXSIZE;
        }
        q->data[q->rear] = e;
        q->size++;
        return OK;
    }
    
    QElemType *deQueue(SqQueue *q) {
        /*队列空了*/
        if (q->size == 0) {
            return ERROR;
        }
        QElemType *e = q->data[q->front];
        q->front = (q->front + 1) % MAXSIZE;
        q->size--;
        return e;
    }
    
    void printStr(SqQueue *q) {
        if (q->rear > q->front) {
            for (int i = q->front; i <= q->rear; ++i) {
                printf("%d,", q->data[i]);
            }
        } else if (q->rear < q->front) {
            for (int i = q->front; i < MAXSIZE; ++i) {
                printf("%d,", q->data[i]);
            }
            for (int k = 0; k < q->rear; ++k) {
                printf("%d,", q->data[k]);
            }
        } else {
            printf("空队列");
        }
        printf("
    ");
    }
    
    int main() {
        SqQueue *sq;
        initQueue(sq);
        for (int i = 0; i < 12; ++i) {
            QElemType k = i + 100;
            Status st = enQueue(sq, k);
            printf("%d插入结果:%d
    .", k, st);
        }
        printStr(sq);
    
    
        for (int j = 0; j < 6; ++j) {
            QElemType *e = deQueue(sq);
            printf("取出%d
    ", e);
        }
        printStr(sq);
        for (int p = 0; p < 7; ++p) {
            QElemType k = p + 200;
            Status st = enQueue(sq, k);
            printf("%d插入结果:%d
    .", k, st);
        }
    
        printStr(sq);
    
        return 0;
    }


    测试结果:

    100插入结果:1
    .101插入结果:1
    .102插入结果:1
    .103插入结果:1
    .104插入结果:1
    .105插入结果:1
    .106插入结果:1
    .107插入结果:1
    .108插入结果:1
    .109插入结果:1
    .110插入结果:-1
    .111插入结果:-1
    .100,101,102,103,104,105,106,107,108,109,
    取出100
    取出101
    取出102
    取出103
    取出104
    取出105
    106,107,108,109,
    200插入结果:1
    .201插入结果:1
    .202插入结果:1
    .203插入结果:1
    .204插入结果:1
    .205插入结果:1
    .206插入结果:-1
    .106,107,108,109,200,201,202,203,204,
  • 相关阅读:
    函数参数传递
    C# 串口发送 陷阱,必须知道的坑
    Altera Quartus 13.1 仿真工具路径错误问题解决 Can't launch the ModelSim-Altera software
    Altium Designer 快速修改板子形状为Keep-out layer大小
    Altium Designer 敷铜间距设置,真实有效
    VS2012,VS2013启用SQLite的Data Provider界面显示
    Sqlite 设置外键级联更新
    Sqlite 设置默认时间为本地时间
    FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程(转)
    FPGA学习记录
  • 原文地址:https://www.cnblogs.com/zhanghaodong/p/10405593.html
Copyright © 2020-2023  润新知