循环列表的实现(数组方式非动态)

本文详细介绍了循环队列的实现过程,包括如何利用额外的空间来避免越界,以及如何进行插入(EnQueue)、删除(DeQueue)操作。通过创建`MyCircularQueue`结构体,实现了队列的基本功能,并提供了检查队列是否为空或已满的方法。在操作过程中,特别注意了对队首和队尾指针的处理,确保了循环队列的正确运行。此外,还强调了理解循环队列工作原理的重要性。
摘要由CSDN通过智能技术生成

循环队列的实现,首先需要一个空的缓冲器,假设有k个空间,若
只给k个空间,那么何时是满,何时是空呢?
在这里插入图片描述
所以此时就需要一个空间来缓冲在这里插入图片描述
这便是基本的设计思路,删除就是front往后移,插入就是rear往后移,但每次都要判空和取余,防止越界的发生。


typedef struct {
    int* a;
    int front;
    int rear;
    int k;

} MyCircularQueue;

bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* p =(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    p->a =(int*)malloc(sizeof(int)*(k+1));
    p->front=0;
    p->rear=0;
    p->k = k;
    return p;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
     obj->a[obj->rear++] = value;
     obj->rear = (obj->rear)%(obj->k+1);
        return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return false;
    else
    {
        obj->front++;
        obj->front%=(obj->k+1); 
        return true;
    }  
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    return obj->a[obj->front];

}

int myCircularQueueRear(MyCircularQueue* obj) {
     if(myCircularQueueIsEmpty(obj))
        return -1;
     else
     {
         int tail = obj->rear-1;
         if(tail == -1)
            tail = obj->k;
            return obj->a[tail];
     }
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->front == obj->rear)
        return true;
    else   
        return false;

}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if(obj->front == (obj->rear+1)%(obj->k+1))
        return true;
    else
        return false;

}

void myCircularQueueFree(MyCircularQueue* obj) {

    free(obj->a);
    free(obj);
}

一般来说对于取队尾的数字,需要判断,因为都是用rear-1去访问的,若rear在第一个空间中,则减一会发生越界访问。

还有很多具体的细节,做一次题,体会下就会理解的更深。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值