队列主要有两部分内容, 循环队列和链队.
都符合队列先进先出的原则
循环队列
比较好理解,放一个其他博主总结好的资源循环队列详解_蓝图_BP的博客-CSDN博客_循环队列
链队
顾名思义,就是用链表表示队列,优势是不用考虑循环队列的最大值问题
链队初始化
// 队列元素 说白了就是个单链表
typedef struct QNode{
int data;
struct QNode *next;
}QNode, *QueuePtr;
// 两个指针, 分别是队头和队尾
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQuene;
LinkQuene* initQuene(){
LinkQuene *L;
L = new LinkQuene;
// 初始化 队头 队尾都指向头节点,指针域都是NULL
L->front = L->rear = new QNode;
L->front->next = NULL;
return L;
}
然后就是入队,出队的问题,在这里,为了方便,入队使用尾插法插入链表,出队从队头出.
如: <---出队 队头->head->N1->N2->N3<-队尾 <---入队
具体代码实现:
#include <iostream>
using namespace std;
// 队列元素 说白了就是个单链表
typedef struct QNode{
int data;
struct QNode *next;
}QNode, *QueuePtr;
// 两个指针,分别是队头和队尾
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQuene;
LinkQuene* initQuene(){
LinkQuene *L;
L = new LinkQuene;
// 初始化 队头 队尾都是NULL
L->front = L->rear = new QNode;
L->front->next = NULL;
return L;
}
bool isEmpty(LinkQuene *L){
// 队尾指向NULL即队列为空
return L->rear == NULL;
}
// 入队
bool enQueue(LinkQuene *L, int e){
QNode *p = new QNode;
p->data = e;
p->next = NULL;
// 更新队尾指针
L->rear->next = p;
L->rear = p;
return true;
}
// 出队
bool deQuene(LinkQuene *L, int &e){
// 队空
if (L->rear == L->front) return false;
// 跳过头节点 p指向队头元素
QNode *p = L->front->next;
e = p->data;
// 修改头指针,头指针后移一位
L->front->next = p->next;
if (L->rear == p){
// 头节点下一节点是尾节点
L->rear = L->front;
}
free(p);
return true;
}
void print(LinkQuene *L){
QNode *p = L->front->next;
while(p != L->rear && L->rear != L->front){
cout << p->data <<", ";
p = p->next;
}
cout << L->rear->data << endl;
}
int main(){
LinkQuene *L = initQuene();
cout << "1, 2, 3, 4依次入队" << endl;
enQueue(L, 1);
enQueue(L, 2);
enQueue(L, 3);
enQueue(L, 4);
cout << "显示队列:" << endl;
print(L);
int item = 0;
for (int i = 0; i < 5; i++){
if(deQuene(L, item)){
cout << "出队: " << item << endl;
cout << "队列:";
print(L);
}else {
cout << "队空!无法出队" << endl;
}
}
return 0;
}
运行结果
1, 2, 3, 4依次入队
显示队列:
1, 2, 3, 4
出队: 1
队列:2, 3, 4
出队: 2
队列:3, 4
出队: 3
队列:4
出队: 4
队列:0
队空!无法出队
Program ended with exit code: 0