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;
    }
    
  • 相关阅读:
    TCO 2013 2A
    matlab 中的fmincon参数设定问题
    一步步写自己SqlHelper类库(四):Connection对象
    珠海立方科技实习总结
    Web Services 应用开发学习笔记(三):XML模式定义
    C#笔记(一):类型,泛型,集合
    Web Services 应用开发学习笔记(二):XML文档类型定义
    一步步写自己SqlHelper类库(三):连接字符串
    一步步写自己SqlHelper类库(二):.NET Framework 数据提供程序
    (Joomla)多功能健康模块
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14123430.html
Copyright © 2011-2022 走看看