首页 > 其他分享 >【模板】手写基本数据结构

【模板】手写基本数据结构

时间:2024-11-03 14:58:07浏览次数:1  
标签:idx int top 元素 栈顶 stk 手写 数据结构 模板

STL模板

STL 中的 stack 容器提供了一众成员函数以供调用,常见的包括但不限于如下:

创建一个栈:

  • stack<int> stk;

修改元素:

  • stk.push(x); 将传入的参数插入到栈顶。
  • stk.pop(); 将栈顶的元素弹出。

查询:

  • stk.top(); 返回栈顶的元素。
  • stk.empty(); 返回栈是否为空。
  • stk.size(); 返回栈中元素的数量。
// 新建两个栈 st1 和 st2
std::stack<int> st1, st2;

// 为 st1 装入 1
st1.push(1);

// 将 st1 赋值给 st2
st2 = st1;

// 输出 st2 的栈顶元素
cout << st2.top() << endl;
// 输出: 1

数组模拟

通过两个变量 stk[N]top 分别模拟栈的存储和栈顶下标,从而达到实现的目的。

创建一个栈:

  • int stk[N], top;

修改元素:

  • stk[++ top] = x; 将传入的参数插入到栈顶。
  • top --; 将栈顶的元素弹出。

查询:

  • stk[top] 返回栈顶的元素。
  • return top; 返回栈顶是否为空。
  • top 的大小即为栈中元素的多少。
// 新建一个栈 stk1
int stk[N], top;

// 将元素 1 压入栈中
stk[++ top] = 1;

// 输出 stk 中的栈顶元素
cout << stk[top] << endl;
// 输出为 1

// 将 stk 中的元素弹出栈
top --;

// 输出栈的大小
cout << top << endl;
// 输出为 0

队列

STL模板

STL 中的 queue 容器提供了一众成员函数以供调用,常见的包括但不限于如下:

创建一个队列:

  • queue<int> q;

修改元素:

  • q.push(x); 在队尾插入一个元素。
  • q.pop(); 在队头弹出一个元素。

查询:

  • q.front(); 返回队首元素。
  • q.back(); 返回队尾元素。
  • q.empty(); 判断队列是否为空。
  • q.size(); 返回队列中元素多少。
std::queue<int> q1, q2;

// 向 q1 的队尾插入 1
q1.push(1);

// 将 q1 赋值给 q2
q2 = q1;

// 输出 q2 的队首元素
std::cout << q2.front() << std::endl;
// 输出: 1

数组模拟

通过三个变量 q[N]hhtt 分别表示队列数组,队首和队尾。

创建一个队列:

  • int q[N], hh = 0, tt = -1;

修改元素:

  • q[++ tt] = x; 将传入的参数插入队尾。
  • hh ++;将队头弹出。
  • tt --;将队尾弹出。

查询:

  • q[hh] 返回对头的元素。
  • hh <= tt;判断队列是否为空。
  • tt - hh + 1返回队列中元素的数量。
int q[N], hh = 0, tt = -1;

// 向 q 的队尾插入 1
q[++ tt] = 1;

// 输出队列中的元素数量
cout << tt - hh + 1 << '\n';

// 输出队头元素并弹出
cout << q[hh ++] << '\n';

链表

由于链表的 STL 容器(list)并不常用,直接讲解数组模拟的双向链表。

数组模拟

通过四个变量(val[]r[]l[]idx)分别表示下标为 idx 时的数值,以及这个元素左右两边所指向的下标(非元素本身)。

初始化链表:

  • idx = 2, r[0] = 1, l[1] = 0;

修改元素

  • insert(int a, int x) 在第 \(a\) 个节点的右边插入元素 \(x\)。​
  • insert(l[a], x) 在第 \(a\) 个节点的左边插入元素 \(x\)。
void insert(int a, int x)
{
    val[idx] = x;
    l[idx] = a, r[idx] = r[a];
    l[r[a]] = idx, r[a] = idx ++;
}
  • remove(int a) 将第 \(k\) 个元素删除:
void remove(int a)
{
	l[r[a]] = l[a];
    r[l[a]] = r[a];
}

标签:idx,int,top,元素,栈顶,stk,手写,数据结构,模板
From: https://www.cnblogs.com/ThySecret/p/18523433

相关文章

  • 【模板】素数筛
    模板原题1.寻找因数筛法时间复杂度:\(O(n\sqrtn)\)核心模板代码如下:boolisprime(intn){ if(n<2)returnfalse; //0和1都不是 for(inti=2;i*i<=n;++i) if(n%i==0)returnfalse; //有1和它本身以外的其他因子就不是素数了 returntrue;}2.埃......
  • Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
    文章目录一、Redis数据结构概述1.1Redis有哪些数据类型1.2Redis本质是哈希表1.3Redis的哈希冲突与渐进式rehash1.4数据结构底层1.4.1简单动态字符串SDS1.4.2双向链表LinkedList(后续已废弃)1.4.3压缩列表ZipList1.4.4哈希表HashTable1.4.5跳表SkipList1.4.6......
  • [Flag] 数据结构
    本人在11.3日立下此Flag,励志NOIP前学完所有常用数据结构,望周知。NOIP不行就省选标蓝为基本掌握,标红为完全掌握并且可以熟练运用,标黑为未掌握。目标:全部标蓝,1/3标红。堆左偏树配对堆分块分块ST表ST表树状数组区修区查树状数组二......
  • floyed算法模板
    #include<bits/stdc++.h>#include<vector>usingnamespacestd;intlj[1010][1010];//邻接矩阵//可以换成链式前向星之类的巴拉巴拉,这里用邻接矩阵演示比较清楚intn,m;intflyd[1001][1001];intmain(){ cin>>n>>m; for(inti=1;i<=m;i++){ intu,v,w; cin>>u>>......
  • C++模板元编程 实测
    本文记录在各平台(g++、msvc)中实测《C++模板元编程实战:一个深度学习框架的初步实现》中代码的过程。1.3.2节,作者给出了这一段代码:`templatestructWrapper{templatestructFun_{constexprstaticsize_tvalue=0;};template<>structFun_<int>{constexprst......
  • Redis数据结构:List类型全面解析
    文章目录一、List数据类型1.1简介1.2应用场景1.3底层结构二、数据结构2.1压缩列表ZipList2.2双向链表LinkedList(后续已废弃)2.3快速链表QuickList三、List常见命令一、List数据类型1.1简介详细介绍:Redis五种数据类型、String、List、Set、Hash、ZSetRedis......
  • ElasticSearch7.6.x 模板及滚动索引创建及注意事项
    @目录声明:举例说明创建模板+设置滚动索引+读写判断模板是否存在创建模板应用模板创建索引设置滚动索引添加文档,使用“写”别名查询,使用“读”别名本人先关其他文章链接声明:注意点1:滚动索引是设置索引,而非创建索引,且设置一次结果返回"rolled_over":true,则会按照设定规则创建......
  • 数据结构优化动态规划
    类似于单调队列优化,根据转移方程的性质选择合适的优化方案线段树应用场景:方程转移为一个区间且无单调性[ARC085F]NRE先按左端点排序,考虑前\(i\)个区间对答案的贡献,很容易写出\(O(n^2)\)的方程考虑到只会有两类转移点:\(r[j]<l[i]\)或\(l[i]\ler[j]\ler[j]\)(\(r[j]>r[i]\)转......
  • 数据结构好题
    7574--【6.05模拟】数据结构分块二次离线回滚莫队cdq分治+扫描线题目限制太多,考虑先消去\(y\)的限制,很容易想到将点分成\(y\lemid\)和\(y>mid\)两部分,此时上下两部分可以分开统计最大值但是如果直接将询问扔进去又会变成\(O(nQlogn)\)的,考虑这个过程能否优化重要性质:Red......
  • 随便写的一点BinTree模板实现
    `#pragmawarning(disable:4996)includeincludeincludeincludetemplatestructBinNode{int_depth;//节点深度int_height;//节点高度T_data;//存储的数据BinNode*_parent;//父节点BinNode*_lChild;//左子节点BinNode*......