2021-02-17

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";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_48343353

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值