zoukankan      html  css  js  c++  java
  • 循环队列_数组实现

    循环队列是指, 队尾指针走到末尾后, 还可以继续从头开始走.

    front指针仍然是指向第一个元素的前一个元素, rear指针指向最后一个元素.
    下面我们重点讨论一下循环队列如何判断空和满的问题?
    我下面判断队列空和满是直接根据q->length属性来判断, 当q->length为0,
    表示队列为空, 当q->length = maxSize - 1时, 队列为满. 由于遍历上的原因,
    队列的最大长度只能是数组最大长度-1.

    #include <stdio.h>
    #include <stdlib.h>
    
    struct queue {
        int* data;
        int front;
        int rear;
        int maxSize;
        int length;
    };
    typedef struct queue node;
    typedef struct queue* link;
    
    // 函数声明
    link createQueue (int maxSize);
    void printQueue (link q);
    int add (link q, int x);
    int del (link q);
    
    int main () {
        int i;
        int maxSize = 10; // 队列的最大长度
        link qhead = createQueue(maxSize);
    
        // 初始队列信息
        printQueue(qhead);
    
        // 基本入队测试
        for (i=1; i<=10; i++) {
            add(qhead, i * 2);
        }
        printQueue(qhead);
    
        // 基本出队测试
        del(qhead);
        del(qhead);
        del(qhead);
        del(qhead);
        printQueue(qhead);
    
        // 循环入队测试
        add(qhead, 100);
        add(qhead, 200);
        add(qhead, 300);
        add(qhead, 400);
        add(qhead, 500);
    
        printQueue(qhead);
        return 0;
    }
    
    // 创建空队列
    link createQueue (int maxSize) {
        link q;
        q = (node*)malloc(sizeof(node));
        q->data = (int*)malloc(sizeof(int) * maxSize);
        q->front = -1;
        q->rear = -1;
        q->length = 0;
        q->maxSize = maxSize;
        return q;
    }
    
    // 打印
    void printQueue (link q) {
        int i;
        printf("当前队列的信息如下: 
    ");
        printf("front = %d
    ", q->front);
        printf("rear = %d
    ", q->rear);
        printf("length = %d
    ", q->length);
        printf("maxSize = %d
    ", q->maxSize);
    
        // 打印队列中的数据
        if (q->length == 0) {
            printf("当前队列中没有数据
    ");
        } else {
            printf("队列中的数据如下: 
    ");
            i = q->front;
            while (i != q->rear) {
                i = (i + 1) % q->maxSize;
                printf("%d %d
    ", i, q->data[i]);
            }
        }
        printf("
    ");
    }
    
    // 入队
    int add (link q, int x) {
        if (q->length == q->maxSize -1 ) {
            printf("队列已满, 不能入队
    ");
            return 0;
        }
        q->rear = (q->rear + 1) % q->maxSize;
        q->data[q->rear] = x;
        q->length++;
        return 1;
    }
    
    // 出队
    // 错误返回0, 正确返回被出队元素的值
    int del (link q) {
        if (q->length == 0) {
            printf("队列为空, 不能出队
    ");
            return 0;
        }
    
        q->front = (q->front + 1) % q->maxSize;
        q->length--;
        return q->data[q->front];
    }
    
    
    
  • 相关阅读:
    【python】Python 资源大全中文版
    获取最新chromedriver.exe的方法,并查阅最新的chromedriver.exe支持到什么chrome版本
    appium 重新启动apk
    git 命令操作
    [转]IDEA 出现编译错误 Multi-catches are not supported a this language level 解决方法
    jmeter压测前清理内存
    清理kafka zookeeper
    windows 自动移动maven jar包到jmeter 文件夹下面
    jmeter 压测duobbo接口,施压客户端自己把自己压死了
    kafak manager + zookeeper + kafka 消费队列快速清除
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7615741.html
Copyright © 2011-2022 走看看