c++ STL(链表,栈,队列)

链表(linked list),栈(stack),队列(queue)都是常见的数据结构,各自有着不同的特点和应用场景。下面来详细介绍它们的相同点和不同点,以及在实际问题中如何选择使用它们。

相同点:

  1. 存储数据:都可以用来存储一组数据。
  2. 操作方式:都支持基本的数据操作,如插入、删除等。

不同点:

  1. 内部结构

    • 链表:由节点)组成,每个节点包含数据和指向下一个节点的指针。
    • :后进先出的数据结构,只能在栈顶进行插入和删除操作。
    • 队列:先进先出的数据结构,可以在队尾插入数据,在队头删除数据。
  2. 应用特性

    • 链表:适合需要频繁插入、删除操作的场景,因为插入删除操作的时间复杂度为 O(1),不需要像数组一样涉及元素的移动。
    • :适合需要后进先出顺序的场景,如表达式求值、深度优先搜索等。
    • 队列:适合需要先进先出顺序的场景,如广度优先搜索、任务调度等。 

使用场景分析:

  • 链表:当需要频繁地在中间插入或删除元素时,或者不知道需要存储的元素数量时,链表是一个不错的选择。比如管理动态长度的数据集合。

  • :当需要按照后进先出的顺序处理数据时,比如逆序输出、表达式求值(后缀表达式)、回溯算法等,栈是一个非常实用的数据结构。

  • 队列:当需要按照先进先出的顺序处理数据时,比如广度优先搜索、任务调度、缓存实现等,队列是一个合适的选择。

下面附上三种数据结构的示例代码

链表:

#include <iostream>
using namespace std;

struct ListNode {
    int value;
    ListNode* next;
    ListNode(int val) : value(val), next(nullptr) {}
};


int main() {
    // 创建一个链表:1 -> 2 -> 3 -> nullptr
    ListNode* node1 = new ListNode(1);
    ListNode* node2 = new ListNode(2);
    ListNode* node3 = new ListNode(3);
    node1->next = node2;
    node2->next = node3;

    // 遍历链表
    ListNode* current = node1;
    while (current) {
        cout << current->value << " ";
        current = current->next;
    }
    cout << endl;

    // 释放链表内存
    current = node1;
    while (current) {
        ListNode* temp = current;
        current = current->next;
        delete temp;
    }

    return 0;
}

栈:

#include <iostream>
#include <stack>

using namespace std;

int main() {
    stack<int> stk;

    // 向栈中添加元素
    stk.push(1);
    stk.push(2);
    stk.push(3);

    // 从栈中弹出和访问元素
    while (!stk.empty()) {
        cout << stk.top() << " ";  // 输出栈顶元素
        stk.pop();  // 弹出栈顶元素
    }
    cout << endl;

    return 0;
}

队列:

#include <iostream>
#include <queue>

using namespace std;

int main() {
    queue<int> q;

    // 向队列中添加元素
    q.push(1);
    q.push(2);
    q.push(3);

    // 从队列中弹出和访问元素
    while (!q.empty()) {
        cout << q.front() << " ";  // 输出队头元素
        q.pop();  // 弹出队头元素
    }
    cout << endl;

    return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值