链式队列和链表相似, 不过加了限制, 只允许在头进行删除, 尾进行插入(亦或头进行插入, 尾进行删除)
队列的原理: 先进先出
代码实现
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#define MAX_SIZE 10
// 链式队列的定义
typedef int ELEM;
typedef struct _Node {
ELEM date;
struct _Node* next;
}Node;
typedef Node* QueuePrt;
typedef struct _Queue {
int length;
QueuePrt front;
QueuePrt rear;
}Queue;
// 初始化队列
bool initQueue(Queue* q) {
if(!q) return false;
q->length = 0;
q->front = q->rear = NULL;
return true;
}
// 队列是否为空
bool empty(Queue* q) {
if(!q) return false;
if(q->front == NULL) return true;
return false;
}
// 队列是否为满, 理论来讲,它可以无限, 但一定要设置个上限,哪怕1000w,也是可以, 不能“无限”
bool full(Queue* q) {
if(!q) return false;
if(q->length == MAX_SIZE) return true;
return false;
}
// 入队
bool EnQueue(Queue* q, Node& e) {
if(!q) return false;
if(full(q)) return false;
Node* p = new Node;
if(!p) return false;
p->date = e.date;
p->next = NULL;
// 俩种情况 1.第一次入队 2.已入队
if(q->front == NULL) {
q->front = q->rear = p; //1
} else {
q->rear->next = p; //上一次rear指向的节点, 把它的next指向e
q->rear = p; //吧rear指向新节点
}
q->length++;
return true;
}
// 出队
bool DeQueue(Queue* q) {
if(!q) return false;
if(empty(q)) return false; //不存在出队元素
Node* p = q->front;
q->front = p->next;
//1. 出队后,还存在元素 2.出队后,不存在元素, rear置为NULL
if(q->front == NULL) q->rear = NULL;
q->length--;
delete p;
return true;
}
// 获取长队
int length(Queue* q) {
if(!q) return -1;
return q->length;
}
// 获取首元素
void getElem(Queue* q, ELEM& e)
if(!q || !q->front) return ;
e = q->front->date;
}
// 清空队列
void clear(Queue* q) {
if(!q || !q->front) return;
Node* p = q->front;
while(p) {
q->front = p->next;
delete p;
p = q->front;
}
q->front = q->rear = NULL;
q->length = 0;
}
// 遍历
void print(Queue* q) {
if(!q || !q->front) return;
Node* p = q->front;
while(p) {
printf("%d ", p->date);
p = p->next;
}
print("\n");
}
int main(void) {
Queue q;
Node e;
// 初始化队列
initQueue(&q);
for(int i=0; i<=11; i++) {
// 入队
e.date = i+1;
if(EnQueue(&q, e)) {
printf("入队成功\n");
} else {
printf("入队失败\n");
}
}
print(&q);
// 清空队列
// clear(&q);
// 出队三个元素
for(int i=0; i<3; i++) {
if(DeQueue(&q)) {
printf("出队成功\n");
} else {
printf("出失败\n");
}
}
print(&q);
system("pause");
return 0;
}
下图为入队12个元素, 出队3个元素的测试图
下图为入队12个元素,清空队列后, 出队3个元素的测试图