C++实现线性表 - 06 队列(链表实现)

简介: 上一讲,我们用的是数组来实现队列的功能,这一讲我们尝试用链表来实现,其实我认为链表实现比数组实现更容易理解一些。
写在前面:
上一讲,我们用的是数组来实现队列的功能,这一讲我们尝试用链表来实现,其实我认为链表实现比数组实现更容易理解一些。

队列的插入

书接前文,由于上一讲我们已经对队列的定义进行深入的讲解了,我们直接进入代码部分,同样我们也直接实现双端队列的功能。
7.png

用链表进行操作其实就用到了之前我们讲的双向链表操作啦,对应到双端队列里就是左插入和右插入,左删除和右删除。为了方便,这里创建了头结点和尾结点,通过头结点和尾结点可以快速进行操作。具体操作和双向链表几乎一样,没有了解过的小伙伴可以看我之前讲的双向链表那一节。

//左插入
void left_insert(int key) {
    if (Size == maxSize) {
        cout << "该队列已满" << endl;
    }
    else {
        Node* new_node = new Node;
        new_node->val = key;            
        new_node->right = head->right;        
        new_node->left = head;
        head->right = new_node;
        new_node->right->left = new_node;
        Size++;
    }
}

//右插入
void right_insert(int key) {
    if (Size == maxSize) {
        cout << "该队列已满" << endl;
    }
    else {
        Node* new_node = new Node;
        new_node->val = key;
        new_node->right = last;
        new_node->left = last->left;
        last->left = new_node;
        new_node->left->right = new_node;
        Size++;
    }
}

队列的删除

删除操作也分为左删除和右删除,删除操作同样用到的是双向链表的功能。

//右删除
void right_delete() {
    if (Size == 0) {
        cout << "该队列为空" << endl;
    }
    else {
        Node* free_node = last->left;
        free_node->left->right = last;
        last->left = free_node->left;
        delete[]free_node;
        Size--;
    }
}

//左删除
void left_delete() {
    if (Size == 0) {
        cout << "该队列为空" << endl;
    }
    else {
        Node* free_node = head->right;
        free_node->right->left = head;
        head->right = free_node->right;
        delete[]free_node;
        Size--;
    }
}

全部代码

#include<bits/stdc++.h>
using namespace std;

//结点的定义
struct Node {
    int val;
    Node* right;
    Node* left;
};

Node* head;    //头指针
Node* last;    //尾指针
int Size;    //队列中当前元素数量
int maxSize;//队列最大容纳元素数量

void init_node();
void right_insert(int);
void left_insert(int);
void right_delete();
void left_delete();
void show();

int main() {
    init_node();
    right_insert(1);
    left_insert(2);
    right_insert(3);
    left_insert(4);
    right_insert(5);
    left_insert(6);
    show();
    right_delete();
    left_delete();
    show();
    right_delete();
    left_delete();
    right_delete();
    left_delete();
    show();
}

//初始化结点
void init_node() {
    head = new Node;
    last = new Node;
    head->right = last;
    last->left = head;
    head->left = NULL;
    last->right = NULL;
    Size = 0;
    maxSize = 5;
}

//左插入
void left_insert(int key) {
    if (Size == maxSize) {
        cout << "该队列已满" << endl;
    }
    else {
        Node* new_node = new Node;
        new_node->val = key;            
        new_node->right = head->right;        
        new_node->left = head;
        head->right = new_node;
        new_node->right->left = new_node;
        Size++;
    }
}

//右插入
void right_insert(int key) {
    if (Size == maxSize) {
        cout << "该队列已满" << endl;
    }
    else {
        Node* new_node = new Node;
        new_node->val = key;
        new_node->right = last;
        new_node->left = last->left;
        last->left = new_node;
        new_node->left->right = new_node;
        Size++;
    }
}

//右删除
void right_delete() {
    if (Size == 0) {
        cout << "该队列为空" << endl;
    }
    else {
        Node* free_node = last->left;
        free_node->left->right = last;
        last->left = free_node->left;
        delete[]free_node;
        Size--;
    }
}

//左删除
void left_delete() {
    if (Size == 0) {
        cout << "该队列为空" << endl;
    }
    else {
        Node* free_node = head->right;
        free_node->right->left = head;
        head->right = free_node->right;
        delete[]free_node;
        Size--;
    }
}

void show() {
    if (Size == 0) {
        cout << "队列为空" << endl;
    }
    else {
        Node* temp = head->right;
        for (int i = 0; i < Size; i++) {
            cout << temp->val << " ";
            temp = temp->right;
        }
        cout << endl;
    }
}

如果大家有什么问题的话,欢迎在下方评论区进行讨论哦~

目录
相关文章
|
11月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
538 77
|
11月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
449 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
10月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
579 1
|
10月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
208 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
461 64
|
11月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
243 9
|
11月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
254 7
|
11月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
321 7
|
11月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
536 5
|
11月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
374 5