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;
    }
}

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

目录
相关文章
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
127 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
71 5
|
7月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
58 0
|
6月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
7月前
|
数据安全/隐私保护
第2章 栈、队列、链表
第2章 栈、队列、链表
|
7月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
7月前
|
C++ Python
UE C++ 链表
UE C++ 链表
|
7月前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
74 0
|
7月前
|
算法
数据结构和算法学习记录——线性表之双向链表(下)-头插函数、头删函数、查找函数、pos位置之前插入结点、pos位置删除结点及其复用、销毁链表函数
数据结构和算法学习记录——线性表之双向链表(下)-头插函数、头删函数、查找函数、pos位置之前插入结点、pos位置删除结点及其复用、销毁链表函数
34 0
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2