-
Notifications
You must be signed in to change notification settings - Fork 0
/
extendablequeue.c
94 lines (90 loc) · 3.92 KB
/
extendablequeue.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
//------------------------------------------------------------------------
// File Name: myqueue.c
// Author: Dragon
// mail: [[email protected]](mailto:[email protected])
// Created Time: Wed 27 Sep 2023 09:06:03 CST
// Description:
//------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Queue(T) \
typedef struct queue_##T { \
void *start; \
void *end; \
T *ptr; \
int size; \
void (*push)(struct queue_##T * queue, T val); \
void (*pop)(struct queue_##T * queue); \
T(*top) \
(struct queue_##T * queue); \
} queue_##T;
#define queue(T) queue_##T
#define Push(T) \
void push_##T(queue_##T *queue, T val) { \
if (queue->ptr == queue->end) { \
T *newstart = (T *) malloc(2 * queue->size); \
memcpy(newstart, queue->start, queue->size); \
free(queue->start); \
queue->start = newstart; \
queue->end = queue->start + queue->size * 2; \
queue->ptr = queue->start + queue->size; \
queue->size = 2 * queue->size; \
} \
memmove(queue->ptr, &val, sizeof(T)); \
queue->ptr += 1; \
}
#define Pop(T) \
void pop_##T(queue_##T *queue) { \
if ((void *) queue->ptr == queue->start) return; \
memmove(queue->start, queue->start + sizeof(T), queue->end - queue->start - sizeof(T)); \
queue->ptr -= 1; \
}
#define Top(T) \
T top_##T(queue_##T *queue) { \
T data; \
if ((void *) queue->ptr - queue->start < sizeof(T)) return 0; \
memmove(&data, queue->start, sizeof(T)); \
return data; \
}
#define NewQueue(T) \
queue_##T *newqueue_##T() { \
queue_##T *queue = (queue_##T *) malloc(sizeof(queue_##T)); \
queue->start = malloc(sizeof(T) * 32); \
queue->size = 32 * sizeof(T); \
queue->end = queue->start + queue->size; \
queue->ptr = queue->start; \
queue->push = push_##T; \
queue->pop = pop_##T; \
queue->top = top_##T; \
return queue; \
}
#define newqueue(T) newqueue_##T
#define DeleteQueue(T) \
void deletequeue_##T(queue_##T *queue) { \
free(queue->start); \
free(queue); \
}
#define deletequeue(T) deletequeue_##T
#define DEFINEQUEUE(T) Queue(T) \
Push(T) \
Pop(T) \
Top(T) \
NewQueue(T) \
DeleteQueue(T)
DEFINEQUEUE(int)
DEFINEQUEUE(char)
DEFINEQUEUE(float)
DEFINEQUEUE(double)
int main() {
queue(int) *queue = newqueue(int)();
int i = 33;
while (i--)
queue->push(queue, i);
i = 33;
while (i--) {
printf("%d\n", queue->top(queue));
queue->pop(queue);
}
deletequeue(int)(queue);
}