C语言实现循环双端队列

设计循环双端队列

题目描述

你的实现需要支持以下操作:
MyCircularDeque(k):构造函数,双端队列的大小为k。
insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
isEmpty():检查双端队列是否为空。
isFull():检查双端队列是否满了。

代码实现

本题目选自 Leetcode 641 题,以下为 C 语言实现代码
实现细节学习引用 Leetcode 题解,题解入口

typedef struct {
    int *data;
    int head;
    int tail;
    int capacity;
} MyCircularDeque;

// 建立双端循环队列及初始化
MyCircularDeque* myCircularDequeCreate(int k) {
    MyCircularDeque *Dq = (MyCircularDeque *)malloc(sizeof(MyCircularDeque));
    if(!Dq)
        return NULL;
    Dq -> data = (int *)malloc(sizeof(int) * (k + 1));
    if(!Dq -> data)
        return NULL;
    Dq -> head = 0;
    Dq -> tail = 0;
    Dq -> capacity = k + 1;
    return Dq;
}

bool myCircularDequeIsFull(MyCircularDeque* obj);
// 从队头插入数据,成功返回true
bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) {
    if(myCircularDequeIsFull(obj)) {
        return false;
    }
    obj -> head = (obj -> head - 1 + obj -> capacity) % obj -> capacity;
    obj -> data[obj -> head] = value;
    return true;
}

// 从队尾插入数据,成功返回true
bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) {
    if(myCircularDequeIsFull(obj)) {
        return false;
    }
    obj -> data[obj -> tail] = value;
    obj -> tail = (obj -> tail + 1) % obj -> capacity;
    return true;
}

bool myCircularDequeIsEmpty(MyCircularDeque* obj);
// 从队头删除数据,成功返回true
bool myCircularDequeDeleteFront(MyCircularDeque* obj) {
    if(myCircularDequeIsEmpty(obj)) {
        return false;
    }
    obj -> head = (obj -> head + 1) % obj -> capacity;
    return true;
}

//从队尾删除数据,成功返回true
bool myCircularDequeDeleteLast(MyCircularDeque* obj) {
    if(myCircularDequeIsEmpty(obj)) {
        return false;
    }
    obj -> tail = (obj -> tail - 1 + obj -> capacity) % obj -> capacity;
    return true;
}

// Get the front item from the deque
int myCircularDequeGetFront(MyCircularDeque* obj) {
    if(myCircularDequeIsEmpty(obj)) {
        return -1;
    }
    return obj -> data[obj -> head];
}

// Get the last item from the deque
int myCircularDequeGetRear(MyCircularDeque* obj) {
    if(myCircularDequeIsEmpty(obj)) {
        return -1;
    }
    return obj -> data[(obj -> tail - 1 + obj -> capacity) % obj -> capacity];
}

// Checks whether the circular deque is empty or not.
bool myCircularDequeIsEmpty(MyCircularDeque* obj) {
    return (obj -> head == obj -> tail);
}

// Checks whether the circular deque is full or not
bool myCircularDequeIsFull(MyCircularDeque* obj) {
    return ((obj -> tail + 1) % obj -> capacity == obj -> head);
}

void myCircularDequeFree(MyCircularDeque* obj) {
    free(obj -> data);
    obj -> data = NULL;
    free(obj);
    obj = NULL;
}

提交结果

Leetcode 上几次提交结果不一致,可能每次执行的测试用例不同,产生差异,贴出最好的一次结果如下:
641
觉得本题题解中的思路非常好,因此写篇博客记录一下,以备日后学习借鉴引用,好了,睡觉…

发布了37 篇原创文章 · 获赞 15 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 护眼 设计师: 闪电赇

分享到微信朋友圈

×

扫一扫,手机浏览