首页 > 其他分享 >C语言循环队列实现

C语言循环队列实现

时间:2023-03-01 12:44:27浏览次数:53  
标签:obj 队列 MyCircularQueue C语言 int tail 循环 front return

typedef struct {
    int *arr;
    int front;
    int tail;
    int size;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue *obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
    obj->arr = (int *)malloc((k+1) * sizeof(int));
    obj->front = 0;
    obj->tail = 0;
    obj->size = k+1;

    return obj;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if (obj->front == ((obj->tail + 1) % obj->size)) return false;

    obj->arr[(obj->tail)] = value;
    obj->tail = ((obj->tail) + 1) % obj->size;

    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (obj->front == obj->tail) return false;

    (obj->front) = ((obj->front) + 1) % obj->size;

    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if (obj->front == obj->tail) return -1;

    return obj->arr[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if (obj->front == obj->tail) return -1;

    int tmp = (obj->tail - 1 + obj->size) % obj->size;
    return obj->arr[tmp];
}

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

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

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

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 
 * bool param_2 = myCircularQueueDeQueue(obj);
 
 * int param_3 = myCircularQueueFront(obj);
 
 * int param_4 = myCircularQueueRear(obj);
 
 * bool param_5 = myCircularQueueIsEmpty(obj);
 
 * bool param_6 = myCircularQueueIsFull(obj);
 
 * myCircularQueueFree(obj);
*/

622. 设计循环队列 - 力扣(LeetCode)

记录下做题时候碰到的一些问题:
front指向队头元素,tail指向的则是队尾后一个元素(指示的是待插入的位置)。

由于是循环队列,实现的是时候注意取模。

取队尾元素的时候要注意不能对负数%。

(obj->tail - 1 + obj->size) % obj->size

标签:obj,队列,MyCircularQueue,C语言,int,tail,循环,front,return
From: https://www.cnblogs.com/leomehhh/p/17167765.html

相关文章

  • C语言 指针参数 示例代码
    指针参数的DEMO#include<stdio.h>voidhex_printf(char*buf,intbuf_len){inti=0;if(NULL==buf){return;}printf("leni......
  • 分析总结一下所有有关打印题目的套路和思路:pat乙级:1109 擅长C, 1008元素循环右移,1050
    分析:首先你要明白第一件事:所有要打印东西的题目打印都是从第一行到最后一行,从第一列到最后一列,你是没办法跳着打印的。可以看看其他几个打印题目1008元素循环右移,1050螺......
  • 重学C语言(纯代码)
    三子棋,由于game.c中board数组把行列固定了,只能设计三子棋,想要更改格数的话需要更换IsWin函数改成for循环main.c#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#inclu......
  • 《消息队列高手课》笔记(1)
    第一课:01|为什么需要消息队列?总结一、哪些问题适合使用消息队列来解决?1.异步处理可以更快地返回结果;减少等待,自然实现了步骤之间的并发,提升系统总体的性能......
  • 初学C语言2/28
    今天写一些笔记,关于进制转换的ING......
  • C语言自动类型转换
    当运算符的两边出现不一致的类型时,会自动转换较大的类型下面是自动转换规则:char---->short---->int---->long---->longlongint---->float----->double注意:对于print......
  • C语言浮点类型的简单学习
    在C语言中,printf输出inf表示超过范围的浮点数:±∞(inf,-inf)printf输出nan表示不存在的浮点数注意:带小数点的字面量是double而不是floatfloat需要用f或F后缀来表明身份......
  • C++for循环新用法
    1、拷贝range的元素时,使用for(autox:range).2、修改range的元素时,使用for(auto&x:range).3、只读range的元素时,使用for(constauto&x:range).#include<iost......
  • C语言例题
    判断一个数是否为素数#include<stdio.h>intmain(){intn,i=1;printf("请输入n的值:\n");scanf("%d",&n);//此处可用i<=n^(1/2)进行优化......
  • C语言实现大数的加法
    #include<stdio.h>#include<string.h>#defineMAX200inta[MAX],b[MAX],c[MAX];chars1[MAX],s2[MAX];intmain(){gets(s1);gets(s2);intlens......