💻

CSP-J/S 编程学习

首页 C++语法 数据结构 算法 数学 初赛知识点 工具/大纲

📊 数据结构目录

  • 01-数组
  • 02-链表
  • 03-栈和队列
  • 04-哈希表
  • 05-二叉树
  • 06-图
  • STL(标准模板库)

01-数组

数组概述

数组是最基础的数据结构,用于存储相同类型的元素序列。

一维数组

int a[100];
int b[100] = {0};

// 遍历数组
for(int i = 0; i < n; i++) {
    cin >> a[i];
}

二维数组

int a[100][100];

// 遍历二维数组
for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++) {
        cin >> a[i][j];
    }
}

数组常用操作

  • 查找:O(1)(通过下标访问)
  • 插入:O(n)(需要移动元素)
  • 删除:O(n)(需要移动元素)

02-链表

链表概述

链表是一种线性数据结构,元素通过指针连接,不需要连续的内存空间。

单链表

struct Node {
    int data;
    Node* next;
};

// 创建节点
Node* head = new Node();
head->data = 1;
head->next = nullptr;

链表常用操作

  • 查找:O(n)
  • 插入:O(1)(已知位置)
  • 删除:O(1)(已知位置)

双向链表

每个节点有前驱和后继指针,可以双向遍历。

03-栈和队列

栈(Stack)

栈是一种后进先出(LIFO)的数据结构。

#include <stack>
stack<int> s;

s.push(1);   // 入栈
s.push(2);
s.pop();     // 出栈
s.top();     // 获取栈顶元素
s.empty();   // 判断是否为空
s.size();    // 获取栈大小

队列(Queue)

队列是一种先进先出(FIFO)的数据结构。

#include <queue>
queue<int> q;

q.push(1);   // 入队
q.push(2);
q.pop();     // 出队
q.front();   // 获取队首元素
q.back();    // 获取队尾元素

双端队列(Deque)

可以在两端进行插入和删除操作。

04-哈希表

哈希表概述

哈希表通过哈希函数将键映射到存储位置,实现O(1)的查找效率。

STL中的哈希表

#include <unordered_map>
unordered_map<string, int> mp;

mp["apple"] = 5;
mp["banana"] = 3;

cout << mp["apple"];  // 输出5
mp.find("apple");     // 查找
mp.erase("apple");    // 删除

哈希冲突

当不同的键映射到相同的位置时,需要处理冲突。常见方法:链地址法、开放寻址法。

05-二叉树

二叉树概述

每个节点最多有两个子节点(左子树和右子树)。

二叉树遍历

  • 前序遍历:根 -> 左 -> 右
  • 中序遍历:左 -> 根 -> 右
  • 后序遍历:左 -> 右 -> 根
  • 层序遍历:按层次从上到下遍历
// 递归前序遍历
void preorder(TreeNode* root) {
    if(root == nullptr) return;
    cout << root->val;
    preorder(root->left);
    preorder(root->right);
}

二叉搜索树

左子树所有节点的值小于根节点,右子树所有节点的值大于根节点。

06-图

图的表示方法

  • 邻接矩阵:二维数组表示
  • 邻接表:链表或vector表示
// 邻接表
vector<int> adj[1000];
adj[1].push_back(2);
adj[1].push_back(3);

// 遍历邻接表
for(int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i];
}

图的遍历

  • 深度优先搜索(DFS)
  • 广度优先搜索(BFS)

STL(标准模板库)

容器分类

  • 序列容器:vector, deque, list, array
  • 关联容器:set, map, multiset, multimap
  • 无序关联容器:unordered_set, unordered_map
  • 适配器:stack, queue, priority_queue

vector

#include <vector>
vector<int> v;

v.push_back(1);
v.pop_back();
v.size();
v.empty();
v[0];        // 访问元素

set

#include <set>
set<int> s;

s.insert(1);
s.erase(1);
s.find(1);   // 返回迭代器

map

#include <map>
map<string, int> m;

m["key"] = 100;
cout << m["key"];

CSP-J/S 编程学习教程 | 版权所有

↑