C++中常见的数据结构,包括数组、链表、栈、队列、树和图

本文介绍了C++编程中常用的数据结构,如数组、链表、栈、队列、树和图,阐述了它们的定义、用途和实现方法,强调了选择合适的数据结构对程序效率和性能的影响。
摘要由CSDN通过智能技术生成

在C++编程中,数据结构是一种组织和存储数据的方式,它定义了数据之间的关系,使得数据能够被有效地访问和修改。选择适当的数据结构对于解决特定的问题至关重要,因为它能直接影响到程序的效率和性能。下面是一些在C++中常见的数据结构,包括数组、链表、栈、队列、树和图等。

  1. 数组 (Array)
    • 含义:数组是存储一系列相同类型元素的连续内存空间。
    • 用途:用于存储一系列有序的数据,可以随机访问数组中的任意元素。
    • 实现方式:在C++中,数组可以通过静态分配或动态分配来创建。
    • 示例代码
       

      cpp复制代码

      int staticArray[10]; // 静态数组,大小在编译时确定
      int size = 10;
      int* dynamicArray = new int[size]; // 动态数组,大小在运行时确定
  2. 链表 (LinkedList)
    • 含义:链表是一种物理存储单元上非连续的、非顺序的线性表,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
    • 用途:用于动态地进行元素的插入和删除,节省存储空间(特别是当元素数量未知时)。
    • 实现方式:链表通常由一系列节点组成,每个节点至少包含两个部分:存储的数据和指向下一个节点的指针。
    • 示例代码(单链表):
       

      cpp复制代码

      struct Node {
      int data;
      Node* next;
      };
      Node* head = nullptr; // 链表头指针
      Node* newNode = new Node(); // 创建新节点
      newNode->data = 1;
      newNode->next = head;
      head = newNode; // 将新节点插入链表头部
  3. 栈 (Stack)
    • 含义:栈是一种后进先出(LIFO)的数据结构。
    • 用途:用于函数调用、表达式求值、深度优先搜索等。
    • 实现方式:栈可以用数组或链表来实现,通常包含push(压栈)和pop(弹栈)操作。
    • 示例代码(使用STL中的stack):
       

      cpp复制代码

      #include <stack>
      std::stack<int> myStack;
      myStack.push(1); // 压栈
      myStack.push(2);
      int topElement = myStack.top(); // 查看栈顶元素
      myStack.pop(); // 弹栈
  4. 队列 (Queue)
    • 含义:队列是一种先进先出(FIFO)的数据结构。
    • 用途:用于缓冲、事件调度、广度优先搜索等。
    • 实现方式:队列也可以用数组或链表来实现,通常包含enqueue(入队)和dequeue(出队)操作。
    • 示例代码(使用STL中的queue):
       

      cpp复制代码

      #include <queue>
      std::queue<int> myQueue;
      myQueue.push(1); // 入队
      myQueue.push(2);
      int frontElement = myQueue.front(); // 查看队首元素
      myQueue.pop(); // 出队
  5. 树 (Tree)
    • 含义:树是一种非线性数据结构,或是实现抽象数据类型(ADT)或是实现集合类型,用来模拟具有树状结构性质的数据集合。
    • 用途:用于表示层次结构,如文件系统、XML和JSON解析、数据库索引等。
    • 实现方式:树通常由节点和边组成,每个节点可以有零个或多个子节点,但只有一个父节点(除了根节点没有父节点)。
    • 示例代码(二叉树):
       

      cpp复制代码

      struct TreeNode {
      int val;
      TreeNode* left;
      TreeNode* right;
      TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
      };
      TreeNode* root = new TreeNode(1);
      root->left = new TreeNode(2);
      root->right = new TreeNode(3);
  6. 图 (Graph)
    • 含义:图是由顶点(或节点)和连接这些顶点的边构成的集合。
    • 用途:用于表示对象之间的关系,如社交网络、地图、电路网络等。
    • 实现方式:图可以通过邻接矩阵、邻接表等方式来实现。
    • 示例代码(邻接表表示无向图):
       

      cpp复制代码

      #include <vector>
      #include <iostream>
      class Graph {
      int numVertices; // 顶点数
      std::vector<std::vector<int>> adjList; // 邻接表
      public:
      Graph(int vertices) {
      numVertices = vertices;
      adjList.resize(vertices);
      }
      void addEdge(int src, int dest) {
      adjList[src].push_back(dest); // 无向图需要双向添加边
      adjList[dest].push_back(src); // 如果是有向图,此行可以省略
      }
      void printGraph() {
      for (int i = 0; i < numVertices; i++) {
      std::cout << "Vertex " << i << " is connected to: ";
      for (int j : adjList[i]) {
      std::cout << j << " ";
      }
      std::cout << std::endl;
      }
      }
      };
      int main() {
      Graph g(5); // 创建一个包含5个顶点的图
      g.addEdge(0, 1);
      g.addEdge(0, 4);
      g.addEdge(1, 2);
      g.addEdge(1, 3);
      g.addEdge(1, 4);
      g.addEdge(2, 3);
      g.addEdge(3, 4);
      g.printGraph(); // 打印图的信息
      return 0;
      }

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

行动之上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值