-
Notifications
You must be signed in to change notification settings - Fork 3
/
queue.h
169 lines (133 loc) · 4 KB
/
queue.h
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
Copyright (c) 2005-2008, Simon Howard
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* @file queue.h
*
* @brief Double-ended queue.
*
* A double ended queue stores a list of values in order. New values
* can be added and removed from either end of the queue.
*
* To create a new queue, use @ref queue_new. To destroy a queue, use
* @ref queue_free.
*
* To add values to a queue, use @ref queue_push_head and
* @ref queue_push_tail.
*
* To read values from the ends of a queue, use @ref queue_pop_head
* and @ref queue_pop_tail. To examine the ends without removing values
* from the queue, use @ref queue_peek_head and @ref queue_peek_tail.
*
*/
#ifndef ALGORITHM_QUEUE_H
#define ALGORITHM_QUEUE_H
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* A double-ended queue.
*/
typedef struct _Queue Queue;
/**
* A value stored in a @ref Queue.
*/
typedef void *QueueValue;
/**
* A null @ref QueueValue.
*/
#define QUEUE_NULL ((void *) 0)
/**
* Create a new double-ended queue.
*
* @return A new queue, or NULL if it was not possible to allocate
* the memory.
*/
Queue *queue_new(void);
/**
* Destroy a queue.
*
* @param queue The queue to destroy.
*/
void queue_free(Queue *queue);
/**
* Add a value to the head of a queue.
*
* @param queue The queue.
* @param data The value to add.
* @return Non-zero if the value was added successfully, or zero
* if it was not possible to allocate the memory for the
* new entry.
*/
int queue_push_head(Queue *queue, QueueValue data);
/**
* Remove a value from the head of a queue.
*
* @param queue The queue.
* @return Value that was at the head of the queue, or
* @ref QUEUE_NULL if the queue is empty.
*/
QueueValue queue_pop_head(Queue *queue);
/**
* Read value from the head of a queue, without removing it from
* the queue.
*
* @param queue The queue.
* @return Value at the head of the queue, or @ref QUEUE_NULL if the
* queue is empty.
*/
QueueValue queue_peek_head(Queue *queue);
/**
* Add a value to the tail of a queue.
*
* @param queue The queue.
* @param data The value to add.
* @return Non-zero if the value was added successfully, or zero
* if it was not possible to allocate the memory for the
* new entry.
*/
int queue_push_tail(Queue *queue, QueueValue data);
/**
* Remove a value from the tail of a queue.
*
* @param queue The queue.
* @return Value that was at the head of the queue, or
* @ref QUEUE_NULL if the queue is empty.
*/
QueueValue queue_pop_tail(Queue *queue);
/**
* Read a value from the tail of a queue, without removing it from
* the queue.
*
* @param queue The queue.
* @return Value at the tail of the queue, or QUEUE_NULL if the
* queue is empty.
*/
QueueValue queue_peek_tail(Queue *queue);
/**
* Query if any values are currently in a queue.
*
* @param queue The queue.
* @return Zero if the queue is not empty, non-zero if the queue
* is empty.
*/
int queue_is_empty(Queue *queue);
void queue_print(Queue *queue);
bool empty_queue(Queue *self);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef ALGORITHM_QUEUE_H */