队列的数组的实现
1、头文件
(queue.h)
#pragma once
/*
* 队列的数组实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct Queue* createQueue(int maxElements);
bool isEmpty(struct Queue* q);
bool isFull(struct Queue* q);
void disposeQueue(struct Queue* q); //释放队列内存空间
void makeEmpty(struct Queue* q);
void enqueue(int x, struct Queue* q); //入队
void dequeue(struct Queue* q); //出队
int succ(int index, struct Queue* q); //循环数组的角标计算
int front(struct Queue* q);
int frontAndDequeue(struct Queue* q);
void printQueue(struct Queue* q);
struct Queue
{
int capacity; //队列的容量
int size; //队列的有效数据的大小
int front; //队列的角标
int rear; //队尾的角标
int* array; //指针,指向数组首元素的地址(即数组地址)
};
2、主函数
(main.c)
#include "queue.h"
int main()
{
int val;
struct Queue* q;
//创建队列
q = createQueue(5);
//入队
enqueue(1, q);
enqueue(2, q);
enqueue(3, q);
enqueue(4, q);
enqueue(5, q);
//打印队列
printQueue(q);
printf("\n-------------------\n");
//出队
dequeue(q);
dequeue(q);
printQueue(q);
printf("\n-------------------\n");
enqueue(9, q);
printQueue(q);
printf("\n-------------------\n");
//获取表头的元素
val = front(q);
printf("val:%d", val);
printf("\n-------------------\n");
return 0;
}
3、函数的实现
3.1 createQueue.c
#include "queue.h"
struct Queue* createQueue(int maxElements)
{
struct Queue* q = malloc(sizeof(struct Queue));
if (NULL == q) {
printf("内存空间不足,创建队列失败");
return NULL;
}
q->array = malloc(sizeof(int) * maxElements);
if (NULL == q->array) {
printf("内存空间不足,创建队列失败");
return NULL;
}
q->capacity = maxElements;
makeEmpty(q);
return q;
}
3.2 isEmpty.c
#include "queue.h"
bool isEmpty(struct Queue* q)
{
return 0 == q->size;
}
3.3 isFull.c
#include "queue.h"
bool isFull(struct Queue* q)
{
return q->size >= q->capacity;
}
3.4 disposeQueue.c
#include "queue.h"
void disposeQueue(struct Queue* q)
{
if (q->array != NULL) {
free(q->array);
}
if (q != NULL) {
free(q);
}
}
3.5 makeEmpty.c
#include "queue.h"
void makeEmpty(struct Queue* q)
{
q->front = 1;
q->rear = 0;
q->size = 0;
}
3.6 enqueue.c
#include "queue.h"
void enqueue(int x, struct Queue* q)
{
if (isFull(q)) {
printf("队列的空间不足\n");
return;
}
++q->size;
q->rear = succ(q->rear, q);
q->array[q->rear] = x;
}
3.7 dequeue.c
#include "queue.h"
void dequeue(struct Queue* q)
{
if (isEmpty(q)) {
printf("队列为空,无法出栈");
return;
}
--q->size;
q->front = succ(q->front, q);
}
3.8 succ.c
#include "queue.h"
int succ(int index, struct Queue* q)
{
++index;
return index % q->capacity;
}
3.9 front.c
#include "queue.h"
int front(struct Queue* q)
{
if (isEmpty(q)) {
printf("empty queue\n");
return 0;
}
return q->array[q->front];
}
3.10 frontAndDequeue.c
#include "queue.h"
int frontAndDequeue(struct Queue* q)
{
int element;
if (isEmpty(q)) {
printf("empty queue\n");
return 0;
}
element = q->array[q->front];
--q->size;
q->front = succ(q->front, q);
return element;
}
3.11 printQueue.c
#include "queue.h"
void printQueue(struct Queue* q)
{
int front = q->front;
int rear = q->rear;
int size = q->size;
int capacity = q->capacity;
for (int i = front; i < front + size; i++) {
printf("%d ", q->array[i % capacity]);
}
}
4、写在最后
为方便大家学习,我已经将原码上传到了GitHub,欢迎大家下载。链接:link(文件名:队列的数组实现)。