• 顺序队列


    顺序队列

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

    队列构造

     使用结构体构造一个顺序队列,其中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;
    }
    
  • 相关阅读:
    (TOJ1004)渊子赛马
    (TOJ1063)养兔子
    (TOJ3260)Palindromes
    (TOJ1070)Least Common Multiple
    (TOJ1215)数据结构练习题——合并表
    (TOJ1481)C语言实验题——鞍点
    (TOJ1496)C语言实验题——字符过滤
    (TOJ1003)1、2、3、4、5...
    (TOJ1490)C语言实验题——合法的C标识符
    (TOJ2804)Even? Odd?
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14123430.html
Copyright © 2020-2023  润新知