C++语言实现链队列
链队列与顺序循环队列的比较:
相较于顺序循环队列,链队列可以自由伸缩,可以按需分配内存,算法也相较于顺序循环队列易于理解。但链队列每次执行入队与出队操作都要进行申请与释放堆区内存操作,故入队与出队操作相对顺序循环队列较慢,此外链队列还要定义两个结构体,一个是队列的节点,一个是链队列本身。
算法实现
头文件:
#pragma once
#include<iostream>
using namespace std;
using DataType = int;
//定义链队列节点类型。
typedef struct LinkNode {
DataType data;
LinkNode* next;
}Node;
//定义链队列类型。
typedef struct {
Node* front;
Node* rear;
}LinkQueue;
//初始化链队列[时间复杂度o(1)]:
void initQueue(LinkQueue& q);
//判断队列是否为空[时间复杂度o(1)]:
bool is_Empty(const LinkQueue& q);
//入队[时间复杂度o(1)]:
bool enterQueue(LinkQueue& q, const DataType& data);
//出队[时间复杂度o(1)]:
bool exitQueue(LinkQueue& q);
//显示队列[时间复杂度o(n)]:
void display(const LinkQueue& q);
CPP文件:
#include "LinkQueue.h"
void initQueue(LinkQueue& q)
{
q.front = q.rear = nullptr;
}
bool is_Empty(const LinkQueue& q)
{
return q.front == nullptr && q.rear == nullptr;
}
bool enterQueue(LinkQueue& q,const DataType& data)
{
if (is_Empty(q)) {
//利用尾后指针生成一个新的节点。
q.rear = new Node;
if (!q.rear) return false;
q.rear->data = data;
q.rear->next = nullptr;
//队列中只有一个节点时,该节点既是首节点也是尾节点。
q.front = q.rear; //让首指针指向首元素。
}
else {
q.rear->next = new Node;
if (!q.rear->next) return false;
q.rear = q.rear->next;
q.rear->data = data;
q.rear->next = nullptr;
}
return true;
}
bool exitQueue(LinkQueue& q)
{//空队列无法指向出队操作。
if (is_Empty(q)) return false;
Node* tmp = q.front;
q.front = q.front->next;
//若只有一个节点(front和rear指向该节点)。
if (q.rear == tmp) q.rear = nullptr;
delete tmp;
return true;
}
void display(const LinkQueue& q)
{
Node* tmp = q.front;
while (tmp) {
cout << tmp->data << " ";
tmp = tmp->next;
}
cout << "\n";
}