-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathq.c
99 lines (75 loc) · 2.11 KB
/
q.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ELEMENT_SIZE 50 + 1
typedef struct queueStru {
_Atomic unsigned int head;
_Atomic unsigned int tail;
unsigned int maxSize;
char* elements;
} queue;
queue* createQueue(int maxSize) {
queue* q = (queue*)malloc(sizeof(queue));
q->head = 0, q->tail = 0;
q->maxSize = maxSize + 1;
unsigned int charArrSize = q->maxSize * MAX_ELEMENT_SIZE;
q->elements = (char*)malloc(charArrSize);
memset(q->elements, 0, charArrSize);
return q;
}
void freeQueue(queue* q) {
free(q->elements);
free(q);
}
int enqueue(queue* q, char* element) {
int nextTail = (q->tail + 1) % q->maxSize;
if (nextTail == q->head) {
return -1;
}
memset(&q->elements[q->tail * MAX_ELEMENT_SIZE], 0, MAX_ELEMENT_SIZE);
strncpy(&q->elements[q->tail * MAX_ELEMENT_SIZE], element, MAX_ELEMENT_SIZE);
q->tail = nextTail;
return 1;
}
char* dequeue(queue* q) {
if (q->head == q->tail) {
return NULL;
}
int head = q->head;
q->head = (q->head + 1) % q->maxSize;
return &q->elements[head * MAX_ELEMENT_SIZE];
}
unsigned int count(queue* q) {
if (q->head <= q->tail) {
return q->tail - q->head;
} else {
return q->maxSize - (q->head - q->tail);
}
}
int main() {
int ret;
char* msg;
queue* q = createQueue(3);
msg = dequeue(q);
printf("dequeue: %s, count: %d\n", msg, count(q));
ret = enqueue(q, "first message");
printf("enqueue: %d, count: %d\n", ret, count(q));
ret = enqueue(q, "second message");
printf("enqueue: %d, count: %d\n", ret, count(q));
ret = enqueue(q, "third message");
printf("enqueue: %d, count: %d\n", ret, count(q));
ret = enqueue(q, "fourth message");
printf("enqueue: %d, count: %d\n", ret, count(q));
msg = dequeue(q);
printf("dequeue: %s, count: %d\n", msg, count(q));
msg = dequeue(q);
printf("dequeue: %s, count: %d\n", msg, count(q));
ret = enqueue(q, "fifth message");
printf("enqueue: %d, count: %d\n", ret, count(q));
msg = dequeue(q);
printf("dequeue: %s, count: %d\n", msg, count(q));
msg = dequeue(q);
printf("dequeue: %s, count: %d\n", msg, count(q));
msg = dequeue(q);
printf("dequeue: %s, count: %d\n", msg, count(q));
}