test1
#include <stdio.h>
// 定义队列的最大容量
#define MAXSIZE 100
// 定义队列中元素的数据类型为整型
typedef int ElemType;
// 定义队列结构体
typedef struct
{
// 用于存储队列元素的数组,大小为 MAXSIZE
ElemType data[MAXSIZE];
// 队头指针,指示队列头部元素的位置
int front;
// 队尾指针,指示队列尾部元素的下一个位置
int rear;
} Queue;
// 初始化队列
void initQueue(Queue *Q)
{
// 将队头指针初始化为 0
Q->front = 0;
// 将队尾指针初始化为 0
Q->rear = 0;
}
// 判断队列是否为空
int isEmpty(Queue *Q)
{
// 当队头指针和队尾指针相等时,队列中没有元素,队列为空
if (Q->front == Q->rear)
{
// 打印提示信息
printf("空的\n");
return 1;
}
else
{
return 0;
}
}
// 出队操作
ElemType dequeue(Queue *Q)
{
// 检查队列是否为空
if (Q->front == Q->rear)
{
// 若为空,打印提示信息并返回 0
printf("空的\n");
return 0;
}
// 取出队头元素
ElemType e = Q->data[Q->front];
// 队头指针向后移动一位
Q->front++;
return e;
}
// 队列满时调整队列
int queueFull(Queue *Q)
{
// 当队头指针大于 0 时,说明队列前面有空闲空间
if (Q->front > 0)
{
// 记录队头指针的值,即需要向前移动的步数
int step = Q->front;
// 将队列中的元素向前移动 step 个位置
for (int i = Q->front; i < Q->rear; ++i)
{
Q->data[i - step] = Q->data[i];
}
// 队头指针重置为 0
Q->front = 0;
// 队尾指针相应地向前移动 step 个位置
Q->rear = Q->rear - step;
return 1;
}
else
{
// 队头指针为 0,说明队列真正满了,没有空闲空间可调整
printf("真的满了\n");
return 0;
}
}
// 入队操作
int equeue(Queue *Q, ElemType e)
{
// 检查队尾指针是否超出了队列的最大容量
if (Q->rear >= MAXSIZE)
{
// 尝试调整队列
if(!queueFull(Q))
{
// 调整失败,说明队列确实已满,入队失败
return 0;
}
}
// 将元素 e 放入队尾位置
Q->data[Q->rear] = e;
// 队尾指针向后移动一位
Q->rear++;
return 1;
}
// 获取队头元素
int getHead(Queue *Q, ElemType *e)
{
// 检查队列是否为空
if (Q->front == Q->rear)
{
// 若为空,打印提示信息并返回 0
printf("空的\n");
return 0;
}
// 将队头元素的值赋给指针 e 所指向的内存位置
*e = Q->data[Q->front];
return 1;
}
int main(int argc, char const *argv[])
{
// 定义一个队列变量
Queue q;
// 初始化队列
initQueue(&q);
// 依次将元素 10、20、30、40、50 入队
equeue(&q, 10);
equeue(&q, 20);
equeue(&q, 30);
equeue(&q, 40);
equeue(&q, 50);
// 进行出队操作,并打印出队元素
printf("%d\n",dequeue(&q));
printf("%d\n",dequeue(&q));
// 用于存储队头元素的变量
ElemType e;
// 获取队头元素
getHead(&q, &e);
// 打印队头元素
printf("%d\n",e);
return 0;
}
test2
#include <stdio.h>
#include <stdlib.h>
// 定义队列的最大容量
#define MAXSIZE 100
// 定义队列元素的数据类型为整型
typedef int ElemType;
// 定义队列的结构体
typedef struct
{
// 指向存储队列元素的数组的指针
ElemType *data;
// 队头指针,指示队列头部元素的位置
int front;
// 队尾指针,指示队列尾部元素的下一个位置
int rear;
} Queue;
// 初始化队列
Queue* initQueue()
{
// 为队列结构体分配内存
Queue *q = (Queue*)malloc(sizeof(Queue));
// 为存储队列元素的数组分配内存,大小为 MAXSIZE 个 ElemType 类型元素
q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
// 初始化队头指针为 0
q->front = 0;
// 初始化队尾指针为 0
q->rear = 0;
return q;
}
// 判断队列是否为空
int isEmpty(Queue *Q)
{
// 当队头指针和队尾指针相等时,说明队列为空
if (Q->front == Q->rear)
{
printf("空的\n");
return 1;
}
else
{
return 0;
}
}
// 出队操作
ElemType dequeue(Queue *Q)
{
// 检查队列是否为空
if (Q->front == Q->rear)
{
printf("空的\n");
return 0;
}
// 取出队头元素
ElemType e = Q->data[Q->front];
// 队头指针向后移动一位
Q->front++;
return e;
}
// 队列满了,调整队列
int queueFull(Queue *Q)
{
// 如果队头指针大于 0,说明队列前面有空闲空间
if (Q->front > 0)
{
// 记录队头指针的值,作为移动的步数
int step = Q->front;
// 将队列中的元素向前移动 step 个位置
for (int i = Q->front; i <= Q->rear; ++i)
{
Q->data[i - step] = Q->data[i];
}
// 队头指针重置为 0
Q->front = 0;
// 队尾指针相应地向前移动 step 个位置
Q->rear = Q->rear - step;
return 1;
}
else
{
// 队头指针为 0,说明队列真正满了
printf("真的满了\n");
return 0;
}
}
// 入队操作
int equeue(Queue *Q, ElemType e)
{
// 检查队尾指针是否超出了队列的最大容量
if (Q->rear >= MAXSIZE)
{
// 尝试调整队列
if(!queueFull(Q))
{
// 调整失败,入队操作失败
return 0;
}
}
// 将元素 e 放入队尾位置
Q->data[Q->rear] = e;
// 队尾指针向后移动一位
Q->rear++;
return 1;
}
// 获取队头元素
int getHead(Queue *Q, ElemType *e)
{
// 检查队列是否为空
if (Q->front == Q->rear)
{
printf("空的\n");
return 0;
}
// 将队头元素的值赋给指针 e 所指向的内存位置
*e = Q->data[Q->front];
return 1;
}
int main(int argc, char const *argv[])
{
// 初始化一个队列
Queue *q = initQueue();
// 依次将元素 10、20、30、40、50 入队
equeue(q, 10);
equeue(q, 20);
equeue(q, 30);
equeue(q, 40);
equeue(q, 50);
// 进行出队操作,并打印出队元素
printf("%d\n",dequeue(q));
printf("%d\n",dequeue(q));
// 用于存储队头元素的变量
ElemType e;
// 获取队头元素
getHead(q, &e);
// 打印队头元素
printf("%d\n",e);
return 0;
}
test3
#include <stdio.h>
#include <stdlib.h>
// 定义队列的最大容量
#define MAXSIZE 100
// 定义队列中元素的类型为整数
typedef int ElemType;
// 定义队列的结构体
typedef struct
{
// 用于存储队列元素的数组指针
ElemType *data;
// 队列头指针,指向队列头部元素的位置
int front;
// 队列尾指针,指向队列尾部元素的下一个位置
int rear;
} Queue;
// 初始化队列
Queue* initQueue()
{
// 为队列结构体分配内存
Queue *q = (Queue*)malloc(sizeof(Queue));
// 为队列的数据数组分配内存,大小为 MAXSIZE 个 ElemType 元素
q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
// 初始化队列头指针为 0
q->front = 0;
// 初始化队列尾指针为 0
q->rear = 0;
return q;
}
// 判断队列是否为空
int isEmpty(Queue *Q)
{
// 当队列头指针和尾指针相等时,队列为空
if (Q->front == Q->rear)
{
printf("空的\n");
return 1;
}
else
{
return 0;
}
}
// 入队操作,将元素 e 加入队列尾部
int equeue(Queue *Q, ElemType e)
{
// 判断队列是否已满,使用取模运算处理循环队列
if ((Q->rear + 1) % MAXSIZE == Q->front)
{
printf("满了\n");
return 0;
}
// 将元素 e 放入队列尾部
Q->data[Q->rear] = e;
// 更新队列尾指针,使用取模运算实现循环
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
// 出队操作,将队列头部元素取出并存储到 e 中
int dequeue(Queue *Q, ElemType *e)
{
// 检查队列是否为空
if (Q->front == Q->rear)
{
printf("空的\n");
return 0;
}
// 将队列头部元素存储到 e 中
*e = Q->data[Q->front];
// 更新队列头指针,使用取模运算实现循环
Q->front = (Q->front + 1) % MAXSIZE;
return 1;
}
// 获取队列头部元素
int getHead(Queue *Q, ElemType *e)
{
// 检查队列是否为空
if (Q->front == Q->rear)
{
printf("空的\n");
return 0;
}
// 将队列头部元素存储到 e 中
*e = Q->data[Q->front];
return 1;
}
int main(int argc, char const *argv[])
{
// 初始化一个队列
Queue *q = initQueue();
// 依次将元素 10、20、30、40、50 入队
equeue(q, 10);
equeue(q, 20);
equeue(q, 30);
equeue(q, 40);
equeue(q, 50);
// 用于存储出队元素的变量
ElemType e;
// 进行一次出队操作
dequeue(q, &e);
// 打印出队的元素
printf("%d\n", e);
// 再进行一次出队操作
dequeue(q, &e);
// 打印出队的元素
printf("%d\n", e);
// 获取队列头部元素
getHead(q, &e);
// 打印队列头部元素
printf("%d\n", e);
return 0;
}
test4
#include <stdio.h>
#include <stdlib.h>
// 定义队列中元素的类型为整数
typedef int ElemType;
// 定义队列节点的结构体
typedef struct QueueNode
{
// 存储节点的数据
ElemType data;
// 指向下一个节点的指针
struct QueueNode *next;
} QueueNode;
// 定义队列的结构体
typedef struct
{
// 指向队列头节点的指针
QueueNode *front;
// 指向队列尾节点的指针
QueueNode *rear;
} Queue;
// 初始化队列
Queue* initQueue()
{
// 为队列结构体分配内存
Queue *q = (Queue*)malloc(sizeof(Queue));
// 为队列的头节点分配内存
QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));
// 头节点的数据初始化为 0
node->data = 0;
// 头节点的下一个节点初始化为 NULL
node->next = NULL;
// 队列的头指针指向头节点
q->front = node;
// 队列的尾指针也指向头节点,此时队列为空
q->rear = node;
return q;
}
// 判断队列是否为空
int isEmpty(Queue *q)
{
// 如果队列的头指针和尾指针相等,说明队列为空
if (q->front == q->rear)
{
return 1;
}
else
{
return 0;
}
}
// 入队操作,将元素 e 加入队列尾部
void equeue(Queue *q, ElemType e)
{
// 为新节点分配内存
QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));
// 新节点的数据设置为 e
node->data = e;
// 新节点的下一个节点初始化为 NULL
node->next = NULL;
// 将新节点连接到队列尾部
q->rear->next = node;
// 更新队列的尾指针指向新节点
q->rear = node;
}
// 出队操作,将队列头部元素取出并存储到 e 中
int dequeue(Queue *q, ElemType *e)
{
// 检查队列是否为空
if (isEmpty(q))
{
printf("空的\n");
return 0;
}
// 找到队列头部的第一个有效节点
QueueNode *node = q->front->next;
// 将该节点的数据存储到 e 中
*e = node->data;
// 更新队列的头指针,跳过该节点
q->front->next = node->next;
// 如果出队的节点是队列的最后一个节点
if (q->rear == node)
{
// 将队列的尾指针指向头节点,使队列再次为空
q->rear = q->front;
}
// 释放出队节点的内存
free(node);
return 1;
}
// 获取队列头部元素
ElemType getFront(Queue *q)
{
// 检查队列是否为空
if (isEmpty(q))
{
printf("空的\n");
return 0;
}
// 返回队列头部的第一个有效节点的数据
return q->front->next->data;
}
int main(int argc, char const *argv[])
{
// 初始化一个队列
Queue *q = initQueue();
// 依次将元素 10、20、30、40、50 入队
equeue(q, 10);
equeue(q, 20);
equeue(q, 30);
equeue(q, 40);
equeue(q, 50);
// 用于存储出队元素的变量
ElemType e;
// 进行一次出队操作
dequeue(q, &e);
// 打印出队的元素
printf("出队%d\n", e);
// 再进行一次出队操作
dequeue(q, &e);
// 打印出队的元素
printf("出队%d\n", e);
// 打印队列头部的元素
printf("%d\n", getFront(q));
return 0;
}