From 99b5bf74dd2bb09d9495abc1021c5c8651131bc9 Mon Sep 17 00:00:00 2001 From: Gonglja Date: Sat, 28 Jan 2023 09:29:44 +0800 Subject: [PATCH 1/4] feat(codes/c): Add array_queue.c initialization --- codes/c/chapter_stack_and_queue/CMakeLists.txt | 3 ++- codes/c/chapter_stack_and_queue/array_queue.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 codes/c/chapter_stack_and_queue/array_queue.c diff --git a/codes/c/chapter_stack_and_queue/CMakeLists.txt b/codes/c/chapter_stack_and_queue/CMakeLists.txt index 5c2be36b64..8b2153ca52 100644 --- a/codes/c/chapter_stack_and_queue/CMakeLists.txt +++ b/codes/c/chapter_stack_and_queue/CMakeLists.txt @@ -1,2 +1,3 @@ add_executable(array_stack array_stack.c) -add_executable(linkedlist_stack linkedlist_stack.c) \ No newline at end of file +add_executable(linkedlist_stack linkedlist_stack.c) +add_executable(array_queue array_queue.c) \ No newline at end of file diff --git a/codes/c/chapter_stack_and_queue/array_queue.c b/codes/c/chapter_stack_and_queue/array_queue.c new file mode 100644 index 0000000000..4fcfb77951 --- /dev/null +++ b/codes/c/chapter_stack_and_queue/array_queue.c @@ -0,0 +1,11 @@ +/** + * File: array_queue.c + * Created Time: 2023-01-28 + * Author: Zero (glj0@outlook.com) + */ + + +/* Driver Code */ +int main() { + return 0; +} \ No newline at end of file From f96fee4dd33a46bcb1dda06059dac758a28e7dc9 Mon Sep 17 00:00:00 2001 From: Gonglja Date: Sat, 28 Jan 2023 11:00:51 +0800 Subject: [PATCH 2/4] feat(codes/c): Add array_queue.c impl --- codes/c/chapter_stack_and_queue/array_queue.c | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/codes/c/chapter_stack_and_queue/array_queue.c b/codes/c/chapter_stack_and_queue/array_queue.c index 4fcfb77951..49040def92 100644 --- a/codes/c/chapter_stack_and_queue/array_queue.c +++ b/codes/c/chapter_stack_and_queue/array_queue.c @@ -4,8 +4,126 @@ * Author: Zero (glj0@outlook.com) */ +#include "../include/include.h" + +/* 基于环形数组形成的队列 */ +struct ArrayQueue { + int *nums; // 用于存储队列元素的数组 + int cap; // 队列容量 + int front; // 头指针,指向队首 + int rear; // 尾指针,指向队尾 + 1 +}; + +typedef struct ArrayQueue ArrayQueue; + +/* 构造函数 */ +void newArrayQueue(ArrayQueue *queue, int capacity) { + // 初始化数组 + queue->cap = capacity; + queue->nums = (int *)malloc(sizeof(int) * queue->cap); + queue->front = 0; + queue->rear = 0; +} + +/* 析构函数 */ +void delArrayQueue(ArrayQueue *queue) { + free(queue->nums); + queue->cap = 0; +} + +/* 获取队列的容量 */ +int capacity(ArrayQueue *queue) { + return queue->cap; +} + +/* 获取队列的长度 */ +int size(ArrayQueue *queue) { + // 由于将数组看作环形队列,可能 rear < front,因此需要取余数 + return (capacity(queue) + queue->rear - queue->front) % capacity(queue); +} + +/* 判断队列是否为空 */ +bool empty(ArrayQueue *queue) { + return queue->rear - queue->front == 0; +} + +/* 访问队首元素 */ +int peek(ArrayQueue *queue) { + assert(size(queue)!=0); + return queue->nums[queue->front]; +} + +/* 入队 */ +void offer(ArrayQueue *queue, int num) { + if (size(queue) == capacity(queue)) { + printf("队列已满\r\n"); + return; + } + queue->nums[queue->rear] = num; + queue->rear = (queue->rear + 1) % capacity(queue); +} + +/* 出队 */ +void poll(ArrayQueue *queue) { + int num = peek(queue); + queue->front = (queue->front + 1) % capacity(queue); +} + +/* 打印基于环形数组形成的队列 */ +void printArrayQueue(ArrayQueue *queue) { + int siz = size(queue); + int cap = capacity(queue); + int arr[siz]; + // 拷贝 + for (int i=0, j=queue->front; inums[j % cap]; + } + printArray(arr, siz); +} + /* Driver Code */ int main() { + /* 初始化队列 */ + int capacity = 10; + ArrayQueue queue; + newArrayQueue(&queue, capacity); + + /* 元素入队 */ + offer(&queue, 1); + offer(&queue, 3); + offer(&queue, 2); + offer(&queue, 5); + offer(&queue, 4); + printf("队列 queue = "); + printArrayQueue(&queue); + + /* 访问队首元素 */ + int peekNum = peek(&queue); + printf("队首元素 peek = %d\r\n", peekNum); + + /* 元素出队 */ + poll(&queue); + printf("出队元素 poll = %d,出队后 queue = ", peekNum); + printArrayQueue(&queue); + + /* 获取队列的长度 */ + int queueSize = size(&queue); + printf("队列长度 size = %d\r\n", queueSize); + + /* 判断队列是否为空 */ + bool isEmpty = empty(&queue); + printf("队列是否为空 = %s\r\n", isEmpty ? "true" : "false"); + + /* 测试环形数组 */ + for (int i = 0; i < 10; i++) { + offer(&queue, i); + poll(&queue); + printf("第 %d 轮入队 + 出队后 queue = ", i); + printArrayQueue(&queue); + } + + // 释放内存 + delArrayQueue(&queue); return 0; } \ No newline at end of file From 70b70ebe5842143d093328674105a99bb04ebd7e Mon Sep 17 00:00:00 2001 From: Gonglja Date: Sat, 28 Jan 2023 11:20:55 +0800 Subject: [PATCH 3/4] style(codes/c): Update array_queue.c code style --- codes/c/chapter_stack_and_queue/array_queue.c | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/codes/c/chapter_stack_and_queue/array_queue.c b/codes/c/chapter_stack_and_queue/array_queue.c index 49040def92..0afbc4c2a8 100644 --- a/codes/c/chapter_stack_and_queue/array_queue.c +++ b/codes/c/chapter_stack_and_queue/array_queue.c @@ -17,12 +17,14 @@ struct ArrayQueue { typedef struct ArrayQueue ArrayQueue; /* 构造函数 */ -void newArrayQueue(ArrayQueue *queue, int capacity) { +ArrayQueue *newArrayQueue(int capacity) { + ArrayQueue *queue = (ArrayQueue *) malloc(sizeof(ArrayQueue)); // 初始化数组 queue->cap = capacity; - queue->nums = (int *)malloc(sizeof(int) * queue->cap); + queue->nums = (int *) malloc(sizeof(int) * queue->cap); queue->front = 0; queue->rear = 0; + return queue; } /* 析构函数 */ @@ -86,44 +88,43 @@ void printArrayQueue(ArrayQueue *queue) { int main() { /* 初始化队列 */ int capacity = 10; - ArrayQueue queue; - newArrayQueue(&queue, capacity); + ArrayQueue *queue = newArrayQueue(capacity); /* 元素入队 */ - offer(&queue, 1); - offer(&queue, 3); - offer(&queue, 2); - offer(&queue, 5); - offer(&queue, 4); + offer(queue, 1); + offer(queue, 3); + offer(queue, 2); + offer(queue, 5); + offer(queue, 4); printf("队列 queue = "); - printArrayQueue(&queue); + printArrayQueue(queue); /* 访问队首元素 */ - int peekNum = peek(&queue); + int peekNum = peek(queue); printf("队首元素 peek = %d\r\n", peekNum); /* 元素出队 */ - poll(&queue); + poll(queue); printf("出队元素 poll = %d,出队后 queue = ", peekNum); - printArrayQueue(&queue); + printArrayQueue(queue); /* 获取队列的长度 */ - int queueSize = size(&queue); + int queueSize = size(queue); printf("队列长度 size = %d\r\n", queueSize); /* 判断队列是否为空 */ - bool isEmpty = empty(&queue); + bool isEmpty = empty(queue); printf("队列是否为空 = %s\r\n", isEmpty ? "true" : "false"); /* 测试环形数组 */ for (int i = 0; i < 10; i++) { - offer(&queue, i); - poll(&queue); + offer(queue, i); + poll(queue); printf("第 %d 轮入队 + 出队后 queue = ", i); - printArrayQueue(&queue); + printArrayQueue(queue); } // 释放内存 - delArrayQueue(&queue); + delArrayQueue(queue); return 0; } \ No newline at end of file From ff7ba96877b2a64bb007dec6478b13d7ba6a52d4 Mon Sep 17 00:00:00 2001 From: Gonglja Date: Sun, 29 Jan 2023 14:22:30 +0800 Subject: [PATCH 4/4] style(codes/c): Update array_queue.c code style --- codes/c/chapter_stack_and_queue/array_queue.c | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/codes/c/chapter_stack_and_queue/array_queue.c b/codes/c/chapter_stack_and_queue/array_queue.c index 0afbc4c2a8..7783e49b81 100644 --- a/codes/c/chapter_stack_and_queue/array_queue.c +++ b/codes/c/chapter_stack_and_queue/array_queue.c @@ -51,7 +51,7 @@ bool empty(ArrayQueue *queue) { /* 访问队首元素 */ int peek(ArrayQueue *queue) { - assert(size(queue)!=0); + assert(size(queue) != 0); return queue->nums[queue->front]; } @@ -77,7 +77,7 @@ void printArrayQueue(ArrayQueue *queue) { int cap = capacity(queue); int arr[siz]; // 拷贝 - for (int i=0, j=queue->front; ifront; i < siz; i++, j++) { arr[i] = queue->nums[j % cap]; } printArray(arr, siz); @@ -86,45 +86,45 @@ void printArrayQueue(ArrayQueue *queue) { /* Driver Code */ int main() { - /* 初始化队列 */ - int capacity = 10; - ArrayQueue *queue = newArrayQueue(capacity); - - /* 元素入队 */ - offer(queue, 1); - offer(queue, 3); - offer(queue, 2); - offer(queue, 5); - offer(queue, 4); - printf("队列 queue = "); - printArrayQueue(queue); - - /* 访问队首元素 */ - int peekNum = peek(queue); - printf("队首元素 peek = %d\r\n", peekNum); - - /* 元素出队 */ - poll(queue); - printf("出队元素 poll = %d,出队后 queue = ", peekNum); - printArrayQueue(queue); - - /* 获取队列的长度 */ - int queueSize = size(queue); - printf("队列长度 size = %d\r\n", queueSize); - - /* 判断队列是否为空 */ - bool isEmpty = empty(queue); - printf("队列是否为空 = %s\r\n", isEmpty ? "true" : "false"); - - /* 测试环形数组 */ - for (int i = 0; i < 10; i++) { - offer(queue, i); + /* 初始化队列 */ + int capacity = 10; + ArrayQueue *queue = newArrayQueue(capacity); + + /* 元素入队 */ + offer(queue, 1); + offer(queue, 3); + offer(queue, 2); + offer(queue, 5); + offer(queue, 4); + printf("队列 queue = "); + printArrayQueue(queue); + + /* 访问队首元素 */ + int peekNum = peek(queue); + printf("队首元素 peek = %d\r\n", peekNum); + + /* 元素出队 */ poll(queue); - printf("第 %d 轮入队 + 出队后 queue = ", i); + printf("出队元素 poll = %d,出队后 queue = ", peekNum); printArrayQueue(queue); - } - // 释放内存 - delArrayQueue(queue); - return 0; + /* 获取队列的长度 */ + int queueSize = size(queue); + printf("队列长度 size = %d\r\n", queueSize); + + /* 判断队列是否为空 */ + bool isEmpty = empty(queue); + printf("队列是否为空 = %s\r\n", isEmpty ? "true" : "false"); + + /* 测试环形数组 */ + for (int i = 0; i < 10; i++) { + offer(queue, i); + poll(queue); + printf("第 %d 轮入队 + 出队后 queue = ", i); + printArrayQueue(queue); + } + + // 释放内存 + delArrayQueue(queue); + return 0; } \ No newline at end of file