只有rear指针的环形循环队列

#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 10
/*
元素个数:(rear - front + maxsize)&maxsize
队列满:(rear + 1)%maxsize == front
下一个入队元素位置:(rear + 1)%maxsize
下一个出队元素位置:(front + 1)%maxsize
队列为空:front == rear
-----------------只有rear指针的情况下:----------
对头为: (Rear + Maxsize - Length) % Maxsize
队列满: (Rear + 1) % Maxsize == (Rear + Maxsize - Length) % Maxsize
队列空: (Rear + Maxsize - Length) % Maxsize == rear
*/
typedef char ElemType;
typedef struct Queue{
    ElemType data[MAXSIZE];
    int length;
    int rear;
}Queue;
bool InitQueue(Queue &Q){
    Q.data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    if(!Q.data) return false;
    length = 0;
    rear = 0;
    return true;
}
bool Enqueue(Queue &Q, ElemType e){
    if((Q.rear + 1)%MAXSIZE == (Q.rear + MAXSIZE - Q.length)%MAXSIZE) return false;
    Q.data[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXSIZE;
    Q.length++;
    return true;
}
bool DeQueue(Queue &Q, ElemType &e){
    if((Q.rear + MAXSIZE - Q.length)%MAXSIZE == Q.rear){
        return false;
    }
    e = Q.data[(Q.rear + MAXSIZE - Q.length)%MAXSIZE];
    Q.length--;
    return true;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
环形指针队列是一种非常常见的数据结构,通常用于解决多任务并发处理、缓存数据等问题。它的核心思想是将队列中的元素存储在一个环形的数组中,通过两个指针front和rear分别指向队头和队尾,实现入队和出队操作。 具体实现原理如下: 1. 定义环形队列结构体,包含队列数组、队头指针front、队尾指针rear、队列长度等信息。 ``` #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int front; int rear; int size; } CircleQueue; ``` 2. 初始化队列,将队头和队尾指针都指向0。 ``` void InitQueue(CircleQueue *queue) { queue->front = 0; queue->rear = 0; queue->size = 0; } ``` 3. 判断队列是否为空,当队头指针等于队尾指针时,队列为空。 ``` int IsEmpty(CircleQueue *queue) { return queue->front == queue->rear; } ``` 4. 判断队列是否满,当队尾指针加1等于队头指针时,队列满。 ``` int IsFull(CircleQueue *queue) { return (queue->rear + 1) % MAXSIZE == queue->front; } ``` 5. 入队操作,将元素插入队尾,队尾指针加1,当队尾指针等于数组长度时,将其置为0。 ``` void EnQueue(CircleQueue *queue, int x) { if (IsFull(queue)) { printf("Queue is full.\n"); return; } queue->data[queue->rear] = x; queue->rear = (queue->rear + 1) % MAXSIZE; queue->size++; } ``` 6. 出队操作,将队头元素弹出,队头指针加1,当队头指针等于数组长度时,将其置为0。 ``` int DeQueue(CircleQueue *queue) { if (IsEmpty(queue)) { printf("Queue is empty.\n"); return -1; } int x = queue->data[queue->front]; queue->front = (queue->front + 1) % MAXSIZE; queue->size--; return x; } ``` 这样,就完成了环形指针队列的实现。需要注意的是,由于在环形队列中,队尾指针可能会超过数组长度,因此需要使用取模运算将其限制在数组范围内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值