欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言之顺序表的循环队列

程序员文章站 2022-06-06 20:58:23
...
/**
    队列是尾进头出的一种数据结构
    这里的front和rear指向的都是待插入的位置,

**/

#include <stdio.h>
#include <stdlib.h>

#define QueueSize_UartLen 4 //表示循环队列存储数组的长度

//重命名循环队列的数据类型
//是结构体类型 
typedef struct
{
    int front;//指向开头
    int rear;//指向结尾
    int counter;//表示目前队列的元素个数
    int uart_data[QueueSize_UartLen];//存储数据使用的数组
}CIRQueue_UART;

void InitQuenue(CIRQueue_UART *queue);//初始化循环队列
int InQueue(CIRQueue_UART *queue, int data);
int OutQueue(CIRQueue_UART *queue, int *p_data);
int QueueFull(CIRQueue_UART *queue);
int QueueEmpty(CIRQueue_UART *queue);

int main()
{
    CIRQueue_UART CIRQueue;

    CIRQueue_UART *queue = &CIRQueue;
    InitQuenue(queue);

    int num = 10;
    int data;
    while(num--){
        if(!InQueue(queue, 1)){
            printf("该队列已满\n");
        }
        OutQueue(queue, &data);
        printf("data = %d\n", data);
        if(!InQueue(queue, 10)){
            printf("该队列已满\n");
        }

        OutQueue(queue, &data);
        printf("data = %d\n", data);

        if(!InQueue(queue, 100)){
            printf("该队列已满\n");
        }


    }

    return 0;
}

void InitQuenue(CIRQueue_UART *queue)
{
    queue->front = 0;
    queue->rear = 0;
    queue->counter = 0;
    for(int i = 0; i < QueueSize_UartLen; i++)
        queue->uart_data[i] = 0;

}

int InQueue(CIRQueue_UART *queue, int data)
{
    if(QueueFull(queue)){
        printf("插入失败\n");
        return 0;
    }else{
        queue->uart_data[queue->rear] = data;
        queue->counter++;
        queue->rear = (queue->rear + 1)%QueueSize_UartLen;//因为是循环队列
        return 1;
    }
}

int OutQueue(CIRQueue_UART *queue, int *p_data)
{
    if(QueueEmpty(queue)){
        printf("当前队列为空\n");
        return 0;
    }else{
        *p_data = queue->uart_data[queue->front];
        printf("front = %d     ",queue->front);
        queue->counter--;
        queue->front = (queue->front + 1)%QueueSize_UartLen;
        return 1;
    }
}

int QueueFull(CIRQueue_UART *queue)
{
    return queue->counter == QueueSize_UartLen;
}
int QueueEmpty(CIRQueue_UART *queue)
{
    return queue->counter == 0;
}

总结其关键在于
C语言之顺序表的循环队列

在编写程序的时候一定要记得创建队列对象
不能还没创建队列,就直接用指针初始化 这时根本没有内存,指向谁 ?
再写这类型程序的时候不能一拿到指针就用 一定要看他指向的内存存不存在

C语言之顺序表的循环队列

相关标签: 循环队列