zoukankan      html  css  js  c++  java
  • 【数据结构】郝斌数据结构——笔记05

    队列 Queue

    定义:

    一种可以实现【先进先出】的存储结构

    分类:

    静态循环队列

    链式队列

    应用:

    与时间相关的操作都与队列有关

    算法操作:

    入列

    出列

    操作核心算法:

    (尾 + 1)% 长度 == 头

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    typedef enum {
        true = 1,
        false = 0
    } boolean;
    
    typedef struct Queue {
       int * pList;
       int front;
       int rear;
       int size;
    } * PQUEUE, QUEUE;
    
    
    void initQueue(PQUEUE pQueue, int size);
    boolean isFull(PQUEUE pQueue);
    boolean isEmpty(PQUEUE pQueue);
    boolean enterQueue(PQUEUE pQueue, int data);
    boolean exitQueue(PQUEUE pQueue, int * pData);
    void traverseQueue(PQUEUE pQueue);
    
    
    int main() {
        QUEUE queue;
    
        initQueue(&queue, 10);
        enterQueue(&queue, 6);
        enterQueue(&queue, 12);
        enterQueue(&queue, 3);
        enterQueue(&queue, 88);
        enterQueue(&queue, 43);
        traverseQueue(&queue);
    
        int aaa;
        exitQueue(&queue, &aaa);
        printf("exitValue[%d]
    ", aaa);
        traverseQueue(&queue);
    
        return 0;
    }
    
    /**
     * 初始化队列,循环队列内核是一个数组,初始化头部尾部位置和大小
     * @param pQueue
     * @param size
     */
    void initQueue(PQUEUE pQueue, int size) {
        pQueue -> size = size;
        pQueue -> pList = (int *) malloc(sizeof(int) * size);
        pQueue -> front = 0;
        pQueue -> rear = 0;
    }
    
    /**
     * 判断满列,尾部索引的下一个位置回到头部就是满了
     * @param pQueue
     * @return
     */
    boolean isFull(PQUEUE pQueue) {
        int rear = pQueue -> rear;
        int front = pQueue -> front;
        int size = pQueue -> size;
        return (rear + 1) % size == front;
    }
    /**
     * 判断空列, 头部和尾部相等 就是空列了(初始化状态)
     * @param pQueue
     * @return
     */
    boolean isEmpty(PQUEUE pQueue) {
        int rear = pQueue -> rear;
        int front = pQueue -> front;
        return front == rear;
    }
    
    /**
     * 入列操作 从尾部装入到头部
     * @param pQueue
     * @param data
     * @return
     */
    boolean enterQueue(PQUEUE pQueue, int data) {
        if (isFull(pQueue)) return false;
        pQueue ->pList[pQueue ->rear] = data;
        pQueue ->rear = (pQueue ->rear + 1) % pQueue ->size;
        return true;
    }
    /**
     * 出列操作, 从头部出来,头部向前推移,也是缩短队列
     * 利用pData参数保存出列的数据
     * @param pQueue
     * @param pData
     * @return
     */
    boolean exitQueue(PQUEUE pQueue, int * pData) {
        if (isEmpty(pQueue)) return false;
        *pData = pQueue ->pList[pQueue ->front];
        pQueue ->front = (pQueue ->front + 1) % pQueue ->size;
        return true;
    }
    
    /**
     * 遍历队列
     * @param pQueue
     */
    void traverseQueue(PQUEUE pQueue) {
        if (isEmpty(pQueue)) return;
        int iterator = pQueue -> front;
        printf("[");
        while (iterator != pQueue -> rear) {
            if (iterator == pQueue -> rear - 1) {
                printf("%d]
    ", pQueue -> pList[iterator]);
                break;
            }
            printf("%d, ", pQueue -> pList[iterator]);
            iterator = (iterator + 1) % pQueue -> size;
        }
    }
    

      

  • 相关阅读:
    Reverse linked list
    Implement Queue by Two Stacks
    Min Stack
    Search a 2D Matrix
    50. Pow(x, n)
    监控hdfs的一个目录,若有新文件,spark就开始处理这个文件,可以使用spark streaming textfilestream来监控该目录
    kafka2在重启消费者以后已经提交offset回退了 什么原因(待完善)
    Hybrid Recommender Systems: Survey and Experiments
    开源实时日志分析平台
    scala为什么要清理闭包
  • 原文地址:https://www.cnblogs.com/mindzone/p/14621195.html
Copyright © 2011-2022 走看看