美文网首页
循环队列的基本操作

循环队列的基本操作

作者: mark_x | 来源:发表于2019-08-19 17:37 被阅读0次
    • 判断队列是否已满:
      (Q->rear+1)%MAX == (Q->front)
    • 判断是否为空:
      Q->rear == Q->front
    • 元素入队,尾指针后移
      Q->rear = (Q->rear + 1) % MAX
    • 元素出队,头指针后移
      Q->front = (Q->front) + 1 % MAX
    • 计算队列长度
      (Q.rear - Q.front + MAX) % MAX
    #include <stdio.h>
    
    #define MAX 6
    
    typedef struct
    {
        int data[MAX];
        int front;   // 头指针
        int rear;   // 尾指针
    }SqQueue;
    
    void InitQueue(SqQueue *Q)
    {
        Q->front = 0;
        Q->rear = 0;
    }
    
    int QueueLength(SqQueue Q)
    {
        return (Q.rear - Q.front + MAX) % MAX;
    }
    
    void EnQueue(SqQueue *Q, int e)
    {
        // 判断队列是否已满
        if ((Q->rear +1) % MAX == Q->front)
        {
            printf("队列已满!\n");
    
        }
        Q->data[Q->rear] = e;  // 在队尾加入新元素
        Q->rear = (Q->rear + 1) % MAX;  // 若到最后则转到数组头部
    }
    
    void DeQueue(SqQueue *Q, int *e)
    {
        if (Q->front == Q->rear)
        {
            printf("队列为空!\n");
        }
        *e = Q->data[Q->front];
        Q->front = (Q->front + 1) % MAX;
    }
    
    int main(void)
    {
        // 初始化循环队列
        SqQueue queue;
        InitQueue(&queue);
        
        // 循环队列求队列长度
        int q_length = QueueLength(queue);
        printf("循环队列长度为:%d\n", q_length);
        
        // 循环队列的入队操作
        EnQueue(&queue, 3);
        EnQueue(&queue, 520);
        printf("循环队列长度为:%d\n", QueueLength(queue));
        
        // 循环队列出队操作
        int num;
        DeQueue(&queue, &num);
        printf("出队元素为:%d\n", num);
        DeQueue(&queue, &num);
        printf("出队元素为:%d\n", num);
        
        
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:循环队列的基本操作

          本文链接:https://www.haomeiwen.com/subject/mtbjsctx.html