循环队列的两种实现方式( 判空与判满存在区别)

//第一种实现方式

front : 队头位置

rear: 队尾下一个位置

size: 元素个数

入队: 尾插,array[rear] = value

出队:++front

循环: front/rear == size;front/rear == 0

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
    int front;
    int rear;
    int* array;
    int size;
    int k;
} MyCircularQueue;

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    mq->array = (int*)malloc(sizeof(int)*k);
    mq->front = mq->rear = 0;
    mq->size = 0;
    mq->k = k;
    return mq;
}

//插入元素
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //判断队列是否为满
    if (obj->size == obj->k)
        return false;
    obj->array[obj->rear++] = value;
    if (obj->rear == obj->k)
        obj->rear = 0;
    obj->size++;
    return true;
}

//删除元素
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (obj->size == 0) {
        return false;
    }
    ++obj->front;
    if (obj->front == obj->k) {
        obj->front = 0;
    }
    --obj->size;
    return true;
}

//获取队首元素
int myCircularQueueFront(MyCircularQueue* obj) {
    if (obj->size == 0)
        return -1;
    return obj->array[obj->front];
}

//获取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
    if (obj->size == 0)
        return -1;
    if (obj->rear == 0)
        return obj->array[obj->k - 1];
    return obj->array[obj->rear-1];
}
//判断队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if (obj->size == 0)
        return true;
    return false;
}

//判断队列是否已满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if (obj->size == obj->k)
        return true;
    return false;
}
//队列销毁
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->array);
    free(obj);
}

//第二种实现方式

front : 队头位置

rear: 队尾下一个位置

入队: 尾插,array[rear] = value

出队:++front

循环: front/rear == size;front/rear == 0

判空: front == rear

(rear+1)%空间大小 == front

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
    int front;
    int rear;
    int* array;
    //int size;
    int k;
} MyCircularQueue;

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    mq->array = (int*)malloc(sizeof(int)*k);
    mq->front = mq->rear = 0;
    //mq->size = 0;
    mq->k = k;
    return mq;
}

//插入元素
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //判断队列是否为满
    if ((obj -> rear+1)%(obj->k+1) ==obj->front)
        return false;
    //尾插
    obj->array[obj->rear++] = value;
    if (obj->rear == obj->k)
        obj->rear = 0;
    //obj->size++;
    return true;
}

//删除元素
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (obj->front == obj ->rear) {
        return false;
    }
    ++obj->front;
    if (obj->front == obj->k) {
        obj->front = 0;
    }
    //--obj->size;
    return true;
}

//获取队首元素
int myCircularQueueFront(MyCircularQueue* obj) {
    if (obj->front == obj ->rear)
        return -1;
    return obj->array[obj->front];
}

//获取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
    if (obj->front == obj ->rear)
        return -1;
    if (obj->rear == 0)
        return obj->array[obj->k - 1];
    return obj->array[obj->rear - 1];
}
//判断队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if (obj->front == obj->rear)
        return true;
    return false;
}

//判断队列是否已满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if ((obj->rear+1)%(obj->k+1)==obj->front)
        return true;
    return false;
}
//队列销毁
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->array);
    free(obj);
}
 

发布了42 篇原创文章 · 获赞 0 · 访问量 1436

猜你喜欢

转载自blog.csdn.net/HUAERBUSHI521/article/details/105376507