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;
        }
    }
    

      

  • 相关阅读:
    Berlekamp-Massey算法学习笔记
    HDU 1848 Fibonacci again and again(SG函数)
    jQuery EasyUI API 中文文档
    视频质量评价方法:VQM
    hdu 4021 24 Puzzle ( 逆序数判断是否可解 )
    大菜鸟学linux-0.11(开始篇)
    Oracle 临时表空间 temp表空间切换
    Android 如何增大开机铃声 M
    使用Jquery+EasyUI 进行框架项目开发案例讲解之三---角色管理源码分享
    Android 如何添加一个新的时区
  • 原文地址:https://www.cnblogs.com/mindzone/p/14621195.html
Copyright © 2011-2022 走看看