C++数组模拟之单链表与双链表和栈和队列的实现过程

下面是一个完整的攻略。

1. 单链表的实现

单链表是一种常用的链式结构,其核心是节点(Node)和指针(pointer):

  • 节点:保存数据和指向下一个节点的指针
  • 指针:用于连接各个节点

以下是单链表的核心代码:

// 节点结构体
struct Node {
    int data;
    Node* next;
    Node(int d): data(d), next(nullptr) {}
};

// 单链表类
class LinkedList {
public:
    LinkedList(): head(nullptr) {}

    void add_front(int data); // 在链表头添加节点
    void add_back(int data); // 在链表尾添加节点
    void remove(int data); // 删除指定数据的节点
    void print(); // 打印链表内容

private:
    Node* head; // 头节点
};

其中,add_frontadd_back方法分别是在链表头和链表尾添加节点,核心思路如下:

  • 在链表头添加节点:

    1. 新建节点
    2. 将head节点作为新节点的下一个节点
    3. 将head更新为新节点
  • 在链表尾添加节点:

    1. 新建节点
    2. 找到链表的最后一个节点
    3. 将最后一个节点的next指针指向新节点

remove方法的核心是找到要删除的节点以及更新节点的next指针。

print方法的核心是遍历链表,并输出每个节点的数据。

以下是add_front方法的示例:

void LinkedList::add_front(int data) {
    Node* new_node = new Node(data);
    new_node->next = head;
    head = new_node;
}

2. 双链表的实现

双链表和单链表类似,不同之处在于:

  • 节点(Node)保存了指向上一个节点的指针(prev)和下一个节点的指针(next)
  • add_front方法需要更新原head节点的prev指针,remove方法需要更新相关节点的prev和next指针

以下是双链表的核心代码:

// 双链表节点结构体
struct Node {
    int data;
    Node* prev;
    Node* next;
    Node(int d): data(d), prev(nullptr), next(nullptr) {}
};

// 双链表类
class DoublyLinkedList {
public:
    DoublyLinkedList(): head(nullptr), tail(nullptr) {}

    void add_front(int data); // 在链表头添加节点
    void add_back(int data); // 在链表尾添加节点
    void remove(int data); // 删除指定数据的节点
    void print(); // 打印链表内容

private:
    Node* head; // 头节点
    Node* tail; // 尾节点
};

以下是add_front方法的示例:

void DoublyLinkedList::add_front(int data) {
    Node* new_node = new Node(data);
    if (head == nullptr) { // 空链表
        head = new_node;
        tail = new_node;
    } else {
        new_node->next = head;
        head->prev = new_node;
        head = new_node;
    }
}

3. 栈的实现

栈(Stack)是一种基于先进后出(LIFO)的数据结构,其核心操作是压入(push)和弹出(pop)元素:

  • 压入元素:将元素放在栈顶
  • 弹出元素:取出栈顶元素

以下是栈的核心代码:

// 栈类
class Stack {
public:
    Stack(): top(-1) {}

    void push(int data); // 压入元素
    int pop(); // 弹出元素
    bool is_empty(); // 判断栈是否为空
    void print(); // 打印栈内容

private:
    static const int MAXSIZE = 100; // 栈最大容量
    int data[MAXSIZE]; // 栈数据
    int top; // 栈顶索引
};

其中,push方法的实现:

void Stack::push(int data) {
    if (top >= MAXSIZE - 1) { // 栈满
        cout << "Stack is full!" << endl;
        return;
    }
    data[++top] = data;
}

pop方法的实现:

int Stack::pop() {
    if (top < 0) { // 栈空
        cout << "Stack is empty!" << endl;
        return -1;
    }
    return data[top--];
}

4. 队列的实现

队列(Queue)是一种基于先进先出(FIFO)的数据结构,其核心操作是入队(enqueue)和出队(dequeue):

  • 入队:将元素加入队尾
  • 出队:取出队头元素

以下是队列的核心代码:

// 队列类
class Queue {
public:
    Queue(): front(0), rear(0) {}

    void enqueue(int data); // 入队
    int dequeue(); // 出队
    bool is_empty(); // 判断队列是否为空
    void print(); // 打印队列内容

private:
    static const int MAXSIZE = 100; // 队列最大容量
    int data[MAXSIZE]; // 队列数据
    int front; // 队头索引
    int rear; // 队尾索引
};

其中,enqueue方法的实现:

void Queue::enqueue(int data) {
    if ((rear + 1) % MAXSIZE == front) { // 队列已满
        cout << "Queue is full!" << endl;
        return;
    }
    data[rear] = data; // 将数据放到队尾
    rear = (rear + 1) % MAXSIZE; // 更新尾指针
}

dequeue方法的实现:

int Queue::dequeue() {
    if (front == rear) { // 队列为空
        cout << "Queue is empty!" << endl;
        return -1;
    }
    int res = data[front]; // 取出队头元素
    front = (front + 1) % MAXSIZE; // 更新头指针
    return res;
}

5. 示例说明

以下是一个示例程序,分别展示了单链表、双链表、栈和队列的基本操作:

int main() {
    // 单链表示例
    LinkedList ll;
    ll.add_front(1);
    ll.add_front(2);
    ll.add_back(3);
    ll.add_back(4);
    ll.print();
    ll.remove(2);
    ll.print();

    // 双链表示例
    DoublyLinkedList dll;
    dll.add_front(1);
    dll.add_front(2);
    dll.add_back(3);
    dll.add_back(4);
    dll.print();
    dll.remove(2);
    dll.print();

    // 栈示例
    Stack s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.print();
    s.pop();
    s.print();

    // 队列示例
    Queue q;
    q.enqueue(1);
    q.enqueue(2);
    q.enqueue(3);
    q.print();
    q.dequeue();
    q.print();

    return 0;
}

以上程序将输出以下结果:

2 -> 1 -> 3 -> 4
1 -> 3 -> 4
2 -> 1 -> 3 -> 4
1 -> 3 -> 4
3 -> 2 -> 1
3 -> 1
3 2 1
2 1
1 -> 2 -> 3
2 -> 3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++数组模拟之单链表与双链表和栈和队列的实现过程 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • phpstorm技巧篇–全局搜索

    以下是PhpStorm技巧篇–全局搜索的完整攻略,包括两个示例说明。 1. 全局搜索简介 全局搜索是一种在整个项目中查找特定文本的功能。在PhpStorm中,可以使用全局搜索来查找变量、函数、类、文件等。全局搜索可以帮助用户快速定位代码中的特定部分,提高开发效率。 2. 全局搜索的使用 要使用全局搜索,可以按照以下步骤进行: 打开全局搜索窗口:在PhpSt…

    other 2023年5月9日
    00
  • JVM:晚期(运行期)优化的深入理解

    JVM:晚期(运行期)优化的深入理解 在JVM的运行期,JIT编译器可以对字节码进行优化,使得Java程序的性能得到提升。本文将深入介绍JVM晚期优化的相关知识。 JVM基础知识 在JVM中,字节码在执行的过程中,通过编译器逐条翻译成机器码并执行。而在JVM执行字节码的过程中,能够进行编译器优化的阶段大致可以分为三个部分: 编译期优化 类加载期优化 运行期优…

    other 2023年6月26日
    00
  • 霍格沃茨之遗崩溃怎么办 游戏崩溃解决方法

    霍格沃茨之遗崩溃怎么办 游戏崩溃解决方法 1.检查游戏配置 在游戏开始之前,我们需要检查游戏的配置是否符合要求,可以通过以下步骤进行检查: 打开游戏列表,找到霍格沃茨之遗游戏,右键点击游戏图标,选择”属性”选项。 在游戏属性窗口中选择”本地文件”选项卡,点击”验证游戏文件完整性”按钮。 如果游戏文件被破坏或缺失,则会自动下载修复文件并覆盖原文件。 在进行游戏…

    other 2023年6月27日
    00
  • php面向对象全攻略 (五) 封装性

    下面是对于「php面向对象全攻略(五)封装性」的完整攻略说明: 什么是封装性 面向对象三大特性中的封装性指的是把对象(或类)的内部状态和行为对外部隐藏起来,只向外部暴露必要的接口,以保证内部数据的安全和灵活性。 具体来说,通过使用访问控制符来限制属性和方法的访问级别。主要有private,protected和public,其中private表示只能在当前类内…

    other 2023年6月25日
    00
  • Python 含参构造函数实例详解

    Python 含参构造函数实例详解 在 Python 中,我们可以为类定义构造函数,用于在创建对象时初始化对象的属性。Python 中的构造函数又称为 __init__() 函数。在本文中,我们将详细讲解含参构造函数的使用,以及如何在类中定义含参构造函数。 定义含参构造函数 含参构造函数与无参构造函数的定义方式相似,唯一不同的地方就是含参构造函数需要在定义时…

    other 2023年6月27日
    00
  • iframe节点初始化的问题探讨

    我们首先来讲一下 iframe 节点的初始化问题探讨。 在实际开发过程中,我们有时候需要引入一些外部页面,我们可以通过使用 iframe 标签来实现。但是在使用 iframe 标签时,如果没有正确的进行初始化,就可能会出现一些莫名其妙的问题。 如果我们不进行 iframe 标签的初始化,例如直接使用下面的代码来引入一个外部页面: <iframe src…

    other 2023年6月20日
    00
  • 基于javascript实现页面加载loading效果

    下面就为你介绍“基于JavaScript实现页面加载loading效果”的完整攻略。 说明 在现代Web应用程序中,页面加载速度很重要,而loading效果可以让用户在等待页面加载时感受到良好的用户体验。本文将详细讲解如何使用JavaScript实现页面加载loading效果,包括两种示例。 基本思路 实现页面加载loading效果,需要以下步骤: 1.在H…

    other 2023年6月25日
    00
  • Win10系统开机提示”cnext.exe 应用程序错误”的故障原因及解决方法

    故障原因 出现”cnext.exe 应用程序错误”的原因可能有以下几种: 病毒或恶意软件感染 – 可能会导致系统文件被破坏或删除。 Windows注册表损坏 – 可能会导致系统异常。 AMD Catalyst驱动程序安装错误 – 可能会导致系统异常。 解决方法 针对”cnext.exe 应用程序错误”,以下是一些可能的解决方法: 执行系统病毒和恶意软件扫描 …

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部