队列:两端"开口", 尾进头出_先进先出( 以图片为准则 理解图片以及记忆原理方法而非概念 )
队头: 队列中出队列的一端
队尾: 队列中进队列的一端
排队问题…
#include
// 入队
// 参数: 存储结构,队尾,数据
// 返回值: 队尾
int enQueue(int* a, int rear, int data) {
// rear: 即将添加数据的位置
a[rear] = data;
printf("元素%d以入队\n", a[rear]);
rear++;
return rear;
}
// 出队
// 参数: 存储结构,队尾,队头
// 返回值: 队头指针
int deQueue(int* a, int rear, int front) {
// 判断
if (rear == front) {
printf("删除失败,队列为空\n");
}
else {
printf("元素%d已出队\n",a[front]);
front++;
}
return front;
}
int main()
{
// 数组(队列)
int a[100];
// 队头和队尾
int rear, front;
// 当队列中没有元素的时候.队头和队尾是同一个地方
rear = front = 0;
// 入队
for (size_t i = 0; i < 5; i++)
{
rear = enQueue(a, rear, i); // 队列中按顺序存入12345
}
// 出队
while (rear != front) {
front = deQueue(a, rear, front);
}
front = deQueue(a, rear, front);
}
问题1: 头和尾不断递增, 而数组有限制
问题2: 如果不断存储,不出队列,数组需要扩容
个位可以想一想啊, 往后一起我写出我的解决方案, 但是想看看大佬们的操作
#include
#include
// 节点
typedef struct QNode {
int data;
struct QNode* next;
}QNode;
// 创建队列(头节点)
QNode* initQueue() {
// 创建头节点
QNode* queue = (QNode*)malloc(sizeof(QNode));
// 赋值(头节点不存储数据,或初始化任意值)
queue->next = NULL;
return queue;
}
// 入队
QNode* enQueue(QNode* rear, int data)
{
// 1 做一个新的节点
QNode* NewNode = (QNode*)malloc(sizeof(QNode));
NewNode->data = data;
NewNode->next = NULL;
// 2 使用尾插法添加
rear->next = NewNode;
rear = NewNode;
return rear;
}
// 出队
QNode* deQueue(QNode* front, QNode* rear) {
if (front->next == NULL)
{
printf("队列为空!\n");
return rear;
}
// 创建临时指针
QNode* pList = front->next;
// 显示数据
printf("%d ",pList->data);
// 断头, 换头
front->next = pList->next;
// 判断
if (rear == pList)
{
rear = front;
}
// 释放
free(pList);
return rear;
}
int main() {
QNode* queue, * front, * rear;
queue = front = rear = initQueue();
// 入队
for (size_t i = 1; i <= 5; i++)
{
rear = enQueue(rear, i);
}
// 出队
rear = deQueue(front, rear);
rear = deQueue(front, rear);
rear = deQueue(front, rear);
rear = deQueue(front, rear);
rear = deQueue(front, rear);
rear = deQueue(front, rear);
return 0;
}