先简单聊聊
队列和栈类似,也是一种特殊的线性表,今天我们使用顺序存储的方式来实现一个循环队列。
队列是什么
队列是一种特殊的线性表,特殊点在于栈具有“先进先出”的一种形式。
1、何为先进先出
只在线性表的一端出队列(通常称为队列头或队头)、在另一端入队列(队列尾或队尾)。 直接上图

2、上代码
代码实现的是一个循环队列,注意是循环队列。其中会有需要的注意的点,请仔细查看代码注释
2.1、准备代码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 5
typedef int Status;
typedef int ElemType;
typedef struct queue{
ElemType data[MAXSIZE];
int front;//队头
int rear;//队尾
}Queue;
2.2、相关代码实现
// init
Status initQueue(Queue *queue) {
queue->front = 0;
queue->rear = 0;
return OK;
}
//clear
Status clearQueue(Queue *queue) {
queue->front = 0;
queue->rear = 0;
return OK;
}
//isEmpty
Status isEmpty(Queue queue) {
if (queue.front == queue.rear) {
return TRUE;
} else {
return FALSE;
}
}
//length
int length(Queue queue) {
//循环队列会有rear<front的情况,所以用取模的方式获取长度
return (queue.rear - queue.front + MAXSIZE) % MAXSIZE;
}
//getHeader
Status getHeader(Queue queue, ElemType *elem) {
if (isEmpty(queue)) {
return ERROR;
} else {
*elem = queue.data[queue.front];
return OK;
}
}
//push
Status pushElem2Queue(Queue *queue, ElemType elem) {
//和获取长度的方式类似,判断是否是满队列也需要用取模的方式处理
if ((queue->rear + 1) % MAXSIZE == queue->front) {
printf("is full queue\n");
return ERROR;
} else {
queue->data[queue->rear] = elem;
queue->rear = (queue->rear + 1) % MAXSIZE;
return OK;
}
}
//pop
Status popElemFromQueue(Queue *queue, ElemType *elem) {
if (isEmpty(*queue)) {
printf("is empty queue\n");
return ERROR;
} else {
*elem = queue->data[queue->front];
//这里也需要注意
queue->front = (queue->front + 1) % MAXSIZE;
return OK;
}
}
//display
void display(Queue queue) {
int i = queue.front;
while (i % MAXSIZE != queue.rear) {
printf("%d ", queue.data[i]);
i++;
}
printf("\n");
}
2.3相关调用代码
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, Queue!\n");
Queue q;
Status iStatus;
int l;
initQueue(&q);
iStatus = isEmpty(q);
printf("is empty: %d\n", iStatus);
l = length(q);
printf("length: %d\n", l);
iStatus = pushElem2Queue(&q, 1);
iStatus = pushElem2Queue(&q, 2);
iStatus = pushElem2Queue(&q, 3);
iStatus = pushElem2Queue(&q, 4);
iStatus = pushElem2Queue(&q, 5);
display(q);
printf("pop\n");
ElemType elem;
iStatus = popElemFromQueue(&q, &elem);
display(q);
iStatus = popElemFromQueue(&q, &elem);
display(q);
iStatus = popElemFromQueue(&q, &elem);
display(q);
iStatus = popElemFromQueue(&q, &elem);
display(q);
return 0;
}
2.4、打印结果
Hello, Queue!
is empty: 1
length: 0
is full queue
1 2 3 4
pop
2 3 4
3 4
4
is empty queue
Program ended with exit code: 0
链式存储方式的队列
参考下一篇文章数据结构-队列-链式存储