循环队列C力扣

队列循环

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

整体思路解析:

                1、利用malloc开辟一个数组的空间在里面存储数据。

                2、利用back和front去寻找首元素和尾元素。

                3、利用对元素k的取模重置back和front。

结构体定义

tip:自己需要什么方便解题就怎么来。

思路解析:

                需要使用back、front、一个指向数组的指针和为了重置back和front的元素k.

代码展示:

typedef struct {
    int *a;
    int back;
    int front;
    int k;
} MyCircularQueue;

MyCircularQueue(k): 构造器,设置队列长度为 k 。

思路解析:

                开辟一个结构体的空间和一个数组的空间然后把数据都置为空返回结构体即可。

代码展示:

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

Front: 从队首获取元素。如果队列为空,返回 -1 。

思路解析:

                对目标进行判断(利用empty函数)如果为空就返回-1,不为空就利用front去访问数组即可。

代码展示:

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

Rear: 获取队尾元素。如果队列为空,返回 -1 。

思路解析:

                利用元素k重置back,使back重新从第一个数据开始往后走。

代码展示:

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    return obj->a[(obj->back+(obj->k+1)-1)%(obj->k+1)];
}
v

enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。

思路解析:

                直接使用back进行数据的插入,然后后置加加最后利用k元素把back重置到数组的第一个位置。

代码展示:

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

deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。

思路解析:

                因为是直接用front进行访问所以直接利用front++即可。

代码展示:

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

isEmpty(): 检查循环队列是否为空。

思路解析:

                所以判断是否为空直接就是看back和front是否相等,初始化都赋的是0。

代码展示:

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
 return  obj->back==obj->front;
}

isFull(): 检查循环队列是否已满。

思路解析: 

                 因为初始化时back和front是都赋为0的要是空间都满了的情况back的下一个就是front,利用元素k使back重新从第一个位置开始。

代码展示:

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->back+1)%(obj->k+1)==obj->front;
}

数据销毁

思路解析:

                先freemalloc出来的数组然后把malloc出来的结构体也一起free即可。

代码展示:

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}

最长公共前缀是指一组字符串中,所有字符串都有的最长的前缀。根据提供的代码,可以看出这是一个用C语言实现的求解最长公共前缀的函数。函数的输入是一个字符串数组和数组的大小,输出是一个字符指针,指向最长公共前缀的起始位置。 这个函数的实现思路是,首先取数组中第一个字符串的第一个字符作为初始比较字符,然后遍历数组中的每个字符串的相同位置的字符,如果有不相同的字符,则退出循环。如果所有字符串的相同位置的字符都相同,则将初始比较字符更新为下一个位置的字符,继续比较下一位置的字符,直到遍历完所有字符串或者找到不相同的字符。最后,将最长公共前缀的末尾字符置为'\0',返回最长公共前缀的起始位置。 这个函数的时间复杂度是O(n*m),其中n是字符串数组的大小,m是最长公共前缀的长度。 #### 引用[.reference_title] - *1* *2* [力扣:最长公共前缀(详解)](https://blog.csdn.net/weixin_73142957/article/details/129778838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [力扣专题——14. 最长公共前缀——最长公共前缀C语言解法](https://blog.csdn.net/qq_42479987/article/details/116953103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值