zoukankan      html  css  js  c++  java
  • 顺序队列

    顺序队列

     顺序队列是受到限制的顺序表,是顺序表的一种,符合队列先进先出逻辑。

    队列构造

     使用结构体构造一个顺序队列,其中ent用来指向一个连续内存,size用来指定内存的大小,r_pos和w_pos用来读取和写数据时作为ent的下标。

    typedef struct queue
    {
        int *ent;    //队列入口地址
        int size;
        int r_pos;   //读位置
        int w_pos;   //写位置
    }my_queue, *p_my_queue;
    

    队列初始化

     初始化队列。分配堆内存,设置顺序表大小,r_pos和w_pos应该为0。

    p_my_queue init_queue(int size)
    {
        p_my_queue new_queue =  calloc(1, sizeof(my_queue));
        new_queue->ent = calloc(size, sizeof(int));
    
        if (NULL == new_queue)
            return NULL;
    
        new_queue->r_pos = 0;
        new_queue->w_pos = 0;
        new_queue->size  = size;
    
        return new_queue;
    }
    

    写数据

     写数据,每写一次数据w_pos加1,注意当w_pos+1等于r_pos时,表示队列已满,无法再添加数据了,将会返回退出。

    p_my_queue write_queue(p_my_queue queue_list)
    {
        if (NULL==queue_list)
            return false;
    
        if( (queue_list->w_pos+1)%queue_list->size == queue_list->r_pos)
        {
            printf("Failed to join the queue. The queue is full
    ");
            return queue_list;
        }
        
        queue_list->ent[queue_list->w_pos] = input_msg("Please enter data to join the queue");
        queue_list->w_pos = (queue_list->w_pos+1)%queue_list->size;
        return queue_list;
    }
    

    读数据

     读数据,每读一次r_pos加1,注意当r_pos与w_pos相等时,表示队中没有数据了,将会返回退出。

    int read_queue(p_my_queue queue_list)
    {
        if (NULL==queue_list)
             return false;
        
        if(queue_list->r_pos == queue_list->w_pos)
        {
            printf("There are no data to read
    ");
            return -1;
       }
    
        int data = queue_list->ent[queue_list->r_pos];
        queue_list->r_pos = (queue_list->r_pos+1)%queue_list->size;
    
        return data;
    }
    

    测试程序

    int test()
    {
        p_my_queue queue_list = NULL;
        int size = 8;
    
        queue_list = init_queue(size);
    
        queue_list = write_queue(queue_list);
        queue_list = write_queue(queue_list);
        queue_list = write_queue(queue_list);
        queue_list = write_queue(queue_list);
        queue_list = write_queue(queue_list);
        queue_list = write_queue(queue_list);
        queue_list =  write_queue(queue_list);
        queue_list =  write_queue(queue_list);
    
        for (int i = 0; i < 8; i++)
        {
    
            int data = read_queue(queue_list);
            printf("data:%d
    ", data);
        }
    
        return 0;
    }
    
  • 相关阅读:
    python学习笔记----正则表达式
    MongoDB系统CentOS 7.1 crash的排障过程
    MySQL实例crash的案例分析
    关于MySQL连接抛出Authentication Failed错误分析
    Redis偶发连接失败案例分析
    MYSQL NULL值特性
    一个MySQL 5.7 分区表性能下降的案例分析
    Linux 桥接网络不自动分配IP的问题
    Docker浅析
    配置Servlet 容器
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14123430.html
Copyright © 2011-2022 走看看