---------------------------------
定义 循环队列
初始化 队列
入队
出队
遍历
是否已满
是否已空
---------------------------------
定义 循环队列
// 定义 循环队列
typedef struct Queue
{
int * pBase;// 底层数组
int front; // 队首 下标
int rear; // 队尾 下标
} QUEUE;
初始化 队列
// 初始化 队列
void init(QUEUE * qQueue)
{
printf("输入循环队列的长度 : ");
scanf("%d", &queueLen);
// 数组
qQueue->pBase = (int *) malloc( sizeof(int) * queueLen );
//
qQueue->front = 0;
qQueue->rear = 0;
return;
}
入队
// 入队
bool enterQueue(QUEUE * pQueue, int value)
{
if ( isFull(pQueue) )
{
return false;
}
// 在 rear 索引处 放入值
pQueue->pBase[pQueue->rear] = value;
// rear 索引 加1
pQueue->rear = (pQueue->rear + 1) % queueLen;
return true;
}
出队
// 出队
bool outQueue(QUEUE * pQueue, int * pValue)
{
if ( isEmpty(pQueue) )
{
return false;
}
// 记录出队的元素的值
*pValue = pQueue->pBase[pQueue->front];
// 出队
pQueue->front = (pQueue->front + 1) % queueLen;
return true;
}
遍历
// 遍历
void traverseQueue(QUEUE * pQueue)
{
printf("======遍历======\n");
int start = pQueue->front;
for (; start != pQueue->rear; start = (start + 1) % queueLen)
{
printf("%d\n", pQueue->pBase[start]);
}
return;
}
是否已满
// 判断队列是否已满
bool isFull(QUEUE * pQueue)
{
if ( (pQueue->rear + 1) % queueLen == pQueue->front )
{
return true;
}
return false;
}
是否已空
// 判断队列是否已空
bool isEmpty(QUEUE * pQueue)
{
if (pQueue->rear == pQueue->front)
{
return true;
}
return false;
}
完整代码 07-queue.c
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
int queueLen; // 全局变量, 队列长度
// 定义 循环队列
typedef struct Queue
{
int * pBase;// 底层数组
int front; // 队首 下标
int rear; // 队尾 下标
} QUEUE;
// 初始化 队列
void init(QUEUE * qQueue);
// 入队
bool enterQueue(QUEUE * pQueue, int value);
// 出队
bool outQueue(QUEUE * pQueue, int * pValue);
// 遍历
void traverseQueue(QUEUE * pQueue);
// 判断队列是否已满
bool isFull(QUEUE * pQueue);
// 判断队列是否已空
bool isEmpty(QUEUE * pQueue);
int main(void)
{
QUEUE queue;
// 初始化
init(&queue);
// 入队
int count;
for (count = 0; count < 4; ++count)
{
if ( ! enterQueue(&queue, count + 1) )
{
printf("%d, 入队失败!!!\n", count + 1);
continue;
}
printf("%d, 入队成功!\n", count + 1);
}
// 遍历
traverseQueue(&queue);
// 出队
int value;
for (count = 0; count < 13; ++count)
{
if (outQueue(&queue, &value))
{
printf("出队成功, 出队元素的值: %d\n", value);
continue;
}
printf("出队失败, 再接再励!!\n");
}
traverseQueue(&queue);
return 0;
}
// 初始化 队列
void init(QUEUE * qQueue)
{
printf("输入循环队列的长度 : ");
scanf("%d", &queueLen);
// 数组
qQueue->pBase = (int *) malloc( sizeof(int) * queueLen );
//
qQueue->front = 0;
qQueue->rear = 0;
return;
}
// 入队
bool enterQueue(QUEUE * pQueue, int value)
{
if ( isFull(pQueue) )
{
return false;
}
// 在 rear 索引处 放入值
pQueue->pBase[pQueue->rear] = value;
// rear 索引 加1
pQueue->rear = (pQueue->rear + 1) % queueLen;
return true;
}
// 判断队列是否已满
bool isFull(QUEUE * pQueue)
{
if ( (pQueue->rear + 1) % queueLen == pQueue->front )
{
return true;
}
return false;
}
// 遍历
void traverseQueue(QUEUE * pQueue)
{
printf("======遍历======\n");
int start = pQueue->front;
for (; start != pQueue->rear; start = (start + 1) % queueLen)
{
printf("%d\n", pQueue->pBase[start]);
}
return;
}
// 出队
bool outQueue(QUEUE * pQueue, int * pValue)
{
if ( isEmpty(pQueue) )
{
return false;
}
// 记录出队的元素的值
*pValue = pQueue->pBase[pQueue->front];
// 出队
pQueue->front = (pQueue->front + 1) % queueLen;
return true;
}
// 判断队列是否已空
bool isEmpty(QUEUE * pQueue)
{
if (pQueue->rear == pQueue->front)
{
return true;
}
return false;
}