zoukankan      html  css  js  c++  java
  • 数据结构队列

    队列也是一种数据结构
    队列也可以用来存储数字,这些数字在队列里
    也是有顺序的
    获得的数字一定是最先放进去的数字
    这种使用规则叫先进先出
    实现队列的时候需要提供一个函数用来向队列里
    放数字(push)
    实现队列的时候需要提供一个函数用来从队列里
    获得数字(pop)

    /*
        队列演示
    */
    #ifndef       __01QUEUE_H__
    #define       __01QUEUE_H__
    typedef struct {
        int buf[SIZE];
        int head/*第一个数字所在存储区的下标*/, tail/*第一个空位置所在的下标*/;
    } queue;
    //初始化函数
    void queue_init(queue *);
    //清理函数
    void queue_deinit(queue *);
    //判断队列是否空的函数
    int queue_empty(const queue *);
    //判断队列是否满的函数
    int queue_full(const queue *);
    //获得数字个数的函数
    int queue_size(const queue *);
    //向队列里添加数字的函数
    void queue_push(queue *, int );
    //从队列里拿走数字的函数
    int queue_pop(queue *);
    //从队列里获得数字的函数
    int queue_front(const queue *);
    #endif    //__01QUEUE_H__
    
    
    
    
    
    /*
        队列演示
    */
    #include "01queue.h"
    //初始化函数
    void queue_init(queue *p_queue) {
        p_queue->head = 0;
        p_queue->tail = 0;
    }
    //清理函数
    void queue_deinit(queue *p_queue) {
        p_queue->head = 0;
        p_queue->tail = 0;
    }
    //判断队列是否空的函数
    int queue_empty(const queue *p_queue) {
        return p_queue->head == p_queue->tail;
    }
    //判断队列是否满的函数
    int queue_full(const queue *p_queue) {
        return p_queue->tail == SIZE;
    }
    //获得数字个数的函数
    int queue_size(const queue *p_queue) {
        return p_queue->tail - p_queue->head;
    }
    //向队列里添加数字的函数
    void queue_push(queue *p_queue, int num) {
        p_queue->buf[p_queue->tail] = num;
        p_queue->tail++;
    }
    //从队列里拿走数字的函数
    int queue_pop(queue *p_queue) {
        int ret = p_queue->buf[p_queue->head];
        p_queue->head++;
        return ret;
    }
    //从队列里获得数字的函数
    int queue_front(const queue *p_queue) {
        return p_queue->buf[p_queue->head];
    }
    
    
    
    
    
    
    /*
        队列测试
    */
    #include <stdio.h>
    #include "01queue.h"
    int main() {
        queue que = {0};
        queue_init(&que);
        queue_push(&que, 10);
        queue_push(&que, 20);
        queue_push(&que, 30);
        queue_push(&que, 40);
        queue_push(&que, 50);
        queue_push(&que, 60);
        printf("数字个数是%d
    ", queue_size(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("判断满的结果是%d
    ", queue_full(&que));
        if (!queue_full(&que)) {
            queue_push(&que, 70);
            queue_push(&que, 80);
            printf("%d
    ", queue_pop(&que));
            printf("%d
    ", queue_pop(&que));
        }
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("判断空的结果是%d
    ", queue_empty(&que));
        queue_deinit(&que);
        return 0;
    }
    /*
        队列演示
    */
    #ifndef       __02QUEUE_H__
    #define       __02QUEUE_H__
    typedef struct {
        int buf[SIZE];
        int head/*第一个数字所在存储区的下标*/, tail/*第一个空位置所在的下标*/;
        int num;
    } queue;
    //初始化函数
    void queue_init(queue *);
    //清理函数
    void queue_deinit(queue *);
    //判断队列是否空的函数
    int queue_empty(const queue *);
    //判断队列是否满的函数
    int queue_full(const queue *);
    //获得数字个数的函数
    int queue_size(const queue *);
    //向队列里添加数字的函数
    void queue_push(queue *, int );
    //从队列里拿走数字的函数
    int queue_pop(queue *);
    //从队列里获得数字的函数
    int queue_front(const queue *);
    #endif    //__02QUEUE_H__
    
    
    
    
    
    /*
        队列演示
    */
    #include "02queue.h"
    //初始化函数
    void queue_init(queue *p_queue) {
        p_queue->head = 0;
        p_queue->tail = 0;
        p_queue->num = 0;
    }
    //清理函数
    void queue_deinit(queue *p_queue) {
        p_queue->head = 0;
        p_queue->tail = 0;
        p_queue->num = 0;
    }
    //判断队列是否空的函数
    int queue_empty(const queue *p_queue) {
        return !(p_queue->num);
    }
    //判断队列是否满的函数
    int queue_full(const queue *p_queue) {
        return p_queue->num == SIZE;
    }
    //获得数字个数的函数
    int queue_size(const queue *p_queue) {
        return p_queue->num;
    }
    //向队列里添加数字的函数
    void queue_push(queue *p_queue, int num) {
        p_queue->buf[p_queue->tail] = num;
        p_queue->num++;
        p_queue->tail = (p_queue->tail + 1) % SIZE;
    }
    //从队列里拿走数字的函数
    int queue_pop(queue *p_queue) {
        int ret = p_queue->buf[p_queue->head];
        p_queue->num--;
        p_queue->head = (p_queue->head + 1) % SIZE;
        return ret;
    }
    //从队列里获得数字的函数
    int queue_front(const queue *p_queue) {
        return p_queue->buf[p_queue->head];
    }
    
    
    
    
    
    /*
        队列测试
    */
    #include <stdio.h>
    #include "02queue.h"
    int main() {
        queue que = {0};
        queue_init(&que);
        queue_push(&que, 10);
        queue_push(&que, 20);
        queue_push(&que, 30);
        queue_push(&que, 40);
        queue_push(&que, 50);
        queue_push(&que, 60);
        printf("数字个数是%d
    ", queue_size(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("判断满的结果是%d
    ", queue_full(&que));
        if (!queue_full(&que)) {
            queue_push(&que, 70);
            queue_push(&que, 80);
            printf("%d
    ", queue_pop(&que));
            printf("%d
    ", queue_pop(&que));
        }
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("判断空的结果是%d
    ", queue_empty(&que));
        queue_deinit(&que);
        return 0;
    }
    /*
        队列演示
    */
    #ifndef       __03QUEUE_H__
    #define       __03QUEUE_H__
    typedef struct node {
        int num;
        struct node *p_next;
    } node;
    typedef struct {
        node head, tail;
    } queue;
    //初始化函数
    void queue_init(queue *);
    //清理函数
    void queue_deinit(queue *);
    //判断队列是否空的函数
    int queue_empty(const queue *);
    //判断队列是否满的函数
    int queue_full(const queue *);
    //获得数字个数的函数
    int queue_size(const queue *);
    //向队列里添加数字的函数
    void queue_push(queue *, int );
    //从队列里拿走数字的函数
    int queue_pop(queue *);
    //从队列里获得数字的函数
    int queue_front(const queue *);
    #endif    //__03QUEUE_H__
    
    
    
    
    
    /*
        队列演示
    */
    #include <stdlib.h>
    #include "03queue.h"
    //初始化函数
    void queue_init(queue *p_queue) {
        p_queue->head.p_next = &(p_queue->tail);
        p_queue->tail.p_next = NULL;
    }
    //清理函数
    void queue_deinit(queue *p_queue) {
        while (p_queue->head.p_next != &(p_queue->tail)) {
            node *p_first = &(p_queue->head);
            node *p_mid = p_first->p_next;
            node *p_last = p_mid->p_next;
            p_first->p_next = p_last;
            free(p_mid);
            p_mid = NULL;
        }
    }
    //判断队列是否空的函数
    int queue_empty(const queue *p_queue) {
        return p_queue->head.p_next == &(p_queue->tail);
    }
    //判断队列是否满的函数
    int queue_full(const queue *p_queue) {
        return 0;
    }
    //获得数字个数的函数
    int queue_size(const queue *p_queue) {
        int cnt = 0;
        const node *p_node = NULL;
        for (p_node = &(p_queue->head);p_node != &(p_queue->tail);p_node = p_node->p_next) {
            const node *p_first = p_node;
            const node *p_mid = p_first->p_next;
            const node *p_last = p_mid->p_next;
            if (p_mid != &(p_queue->tail)) {
                cnt++;
            }
        }
        return cnt;
    }
    //向队列里添加数字的函数
    void queue_push(queue *p_queue, int num) {
        node *p_node = NULL;
        node *p_tmp = (node *)malloc(sizeof(node));
        if (!p_tmp) {
            return ;
        }
        p_tmp->num = num;
        p_tmp->p_next = NULL;
        for (p_node = &(p_queue->head);p_node != &(p_queue->tail);p_node = p_node->p_next) {
            node *p_first = p_node;
            node *p_mid = p_first->p_next;
            node *p_last = p_mid->p_next;
            if (p_mid == &(p_queue->tail)) {
                p_first->p_next = p_tmp;
                p_tmp->p_next = p_mid;
                break;
            }
        }
    }
    //从队列里拿走数字的函数
    int queue_pop(queue *p_queue) {
        node *p_first = NULL, *p_mid = NULL, *p_last = NULL;
        int ret = p_queue->head.p_next->num;
        p_first = &(p_queue->head);
        p_mid = p_first->p_next;
        p_last = p_mid->p_next;
        p_first->p_next = p_last;
        free(p_mid);
        p_mid = NULL;
        return ret;
    }
    //从队列里获得数字的函数
    int queue_front(const queue *p_queue) {
        return p_queue->head.p_next->num;
    }
    
    
    
    
    
    /*
        队列测试
    */
    #include <stdio.h>
    #include "03queue.h"
    int main() {
        queue que = {0};
        queue_init(&que);
        queue_push(&que, 10);
        queue_push(&que, 20);
        queue_push(&que, 30);
        queue_push(&que, 40);
        queue_push(&que, 50);
        queue_push(&que, 60);
        printf("数字个数是%d
    ", queue_size(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("判断满的结果是%d
    ", queue_full(&que));
        if (!queue_full(&que)) {
            queue_push(&que, 70);
            queue_push(&que, 80);
            printf("%d
    ", queue_pop(&que));
            printf("%d
    ", queue_pop(&que));
        }
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("%d
    ", queue_pop(&que));
        printf("判断空的结果是%d
    ", queue_empty(&que));
        queue_deinit(&que);
        return 0;
    }
  • 相关阅读:
    TCP/IP研究(1)-Timer(2)
    linux学习
    TCP/IP研究(2)-TCB
    vi学习笔记
    TCP/IP研究(1)-Timer
    yxr:Makefile 简单样本
    zt:vim环境配置
    zt:文件轻松比对,伟大而自由的比较软件们
    就是这么简单!使用Rest-assured 测试Restful Web Services
    手把手教你接口自动化测试 – SoapUI & Groovy
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/8674798.html
Copyright © 2011-2022 走看看