首页 > 其他分享 >数据结构(数组模拟与STL)

数据结构(数组模拟与STL)

时间:2023-08-27 23:33:05浏览次数:52  
标签:include STL 元素 back int tail 数组 push 数据结构

通过数组模拟

int stk[N], top;

void init() { // 初始化
	top = 0;
}

bool isEmpty() { // 判断是否为空
	return top == 0;
}

bool isFull() {
	return top >= MAX - 1;
}

void push(int x) {
    if (isFull()) // 错误(上溢)
    stk[++top] = x;
}

int pop() {
    if (isEmpty()) // 错误 (下溢)
    top--;
    return stk[top + 1];
}

队列(循环队列)

为了区分队列的空与满,规定 tail -> head 之间至少要有一个空位

int Q[N], head, tail;

void init() {
	head = tail = 0;
}

bool isEmpty() {
	return head == tail;
}

bool isFull() {
	return head == (tail + 1) % MAX;
}

void enqueue(int x) {
	if (isFull()) // 错误(上溢)
    Q[tail] = x;
    tail = (tail + 1) % MAX;
}

int dequeue() {
	if (isEmpty()) // 错误(下溢)
	x = Q[head];
    head = (head + 1) % MAX;
    return x;
}

链表

使用结构体更快

STL

stack

头文件:#include <stack>

#include <iostream>
#include <stack>
using namespace std;


int main() {
    stack<int> S;

    S.push(3);  // 向栈中压入
    S.push(7);
    S.push(1);
    cout << S.size() << endl; // 栈的大小

    cout << S.top() << endl; // 1
    S.pop(); // 从栈顶删除元素

    cout << S.top() << endl; // 7
    S.pop();

    cout << S.top() << endl; // 3
    S.pop();

    cout << S.empty() << endl; // 判断栈是否为空
    return 0;
}
函数名 功能 复杂度
size() 返回栈的元素个数 O(1)
top() 返回栈顶的元素 O(1)
pop() 从栈顶取出元素并删除 O(1)
push(x) 向栈中添加元素x O(1)
empty() 在栈为空时返回true O(1)

queue

头文件:#include <queue>

#include <iostream>
#include <string>
#include <queue>
using namespace std;


int main() {
    queue<string> Q;

    Q.push("red"); // 添加
    Q.push("yellow");
    Q.push("bule");

    cout << Q.front() << endl; // red
    Q.pop(); // 删除

    cout << Q.front() << endl; // yellow
    Q.pop();

    cout << Q.front() << endl; // bule
    Q.pop();

    cout << Q.size() << endl;

    cout << Q.empty() << endl;
    return 0;
}
函数名 功能 复杂度
size() 返回队列的元素个数 O(1)
front() 返回队头的元素 O(1)
pop() 从队列中取出元素并删除 O(1)
push(x) 向队列中添加元素x O(1)
empty() 在队列为空时返回true O(1)

vector

头文件:#include <vector>

#include <iostream>
#include <vector>
using namespace std;

void print(vector<double> V) {
    for (int i = 0; i < V.size(); i++) {
        cout << V[i] << " ";
    }
    cout << endl;
}

int main() {
    vector<double> V;

    V.push_back(0.1);
    V.push_back(0.2);
    V.push_back(0.3);
    V[2] = 0.4; // 可以通过下标法修改,但不能通过下标法创建
    print(V); // 0.1 0.2 0.4

    V.insert(V.begin() + 2, 0.8);
    print(V); // 0.1 0.2 0.8 0.4

    V.erase(V.begin() + 1);
    print(V); // 0.1 0.8 0.4

    cout << V.size() << endl;

    V.clear();
    cout << V.size() << endl;
    return 0;
}
函数名 功能 复杂度
size() 返回向量的元素个数 O(1)
push_back(x) 在向量末尾添加元素x O(1)
pop_back() 删除向量的最后一个元素 O(1)
begin() 返回指向向量开头的迭代器 O(1)
endl() 返回指向向量末尾(最后一个元素的后一个位置)的迭代器 O(1)
insert(p, x) 在向量的位置p处插入元素x O(n)
erase(p) 删除向量中位置p处的元素 O(n)
clear() 删除向量中所有元素 O(n)

list

头文件:#include <list>

双向链表

#include <iostream>
#include <list>
using namespace std;


int main() {
    list<char> L;

    L.push_front('b'); // [b]
    L.push_back('c'); // [bc]
    L.push_front('a'); // [abc]

    cout << L.front() << endl; // a
    cout << L.back() << endl; // c

    L.pop_front(); // [bc]
    
    return 0;
}
函数名 功能 复杂度
size() 返回表的元素个数 O(1)
push_front(x) 在表开头添加元素x O(1)
push_back(x) 在表末尾添加元素x O(1)
pop_front() 删除表的开头元素 O(1)
pop_back() 删除表的末尾元素 O(1)
begin() 返回指向表开头的迭代器 O(1)
endl() 返回指向表末尾(最后一个元素的后一个位置)的迭代器 O(1)
insert(p, x) 在表的位置p处插入元素x O(n)
erase(p) 删除表中位置p处的元素 O(n)
clear() 删除表中所有元素 O(n)

list也可以使用下标表示法访问[],与vector相比元素的插入和删除操作的时间复杂度为O(1)

标签:include,STL,元素,back,int,tail,数组,push,数据结构
From: https://www.cnblogs.com/-37-/p/17661121.html

相关文章

  • Redis存取多维对象或数组
    最近阅读tp5的底层类的实现,看到了大神的Redis类的实现,觉得非常的简洁明了,而且统一了所有的get,set,在更新一下,非常值得参考/***读取缓存*@accesspublic*@paramstring$name缓存变量名*@parammixed$default默认值*@returnmixed......
  • 不用循环和递归判断值在数组中的索引
    ////数组集合string[]str=newstring[]{"a","b","c","d","e","f","g"};////要查找的字符串stringNum="c";////使用Linq查询,将索引和值查出来,////新建一个匿名类,属性包括aabool类型,和Index索引......
  • C++—数组
    5数组5.1概述所谓数组,就是一个集合,里面存放了相同类型的数据元素特点1:数组中的每个数据元素都是相同的数据类型特点2:数组是由连续的内存位置组成的5.2一维数组5.2.1一维数组定义方式一维数组定义的三种方式:数据类型数组名[数组长度];数据类型数组名[数组长度......
  • 数组章节的进阶54. 螺旋矩阵
    54. 螺旋矩阵1classSolution:2defspiralOrder(self,matrix:List[List[int]])->List[int]:3m,n=len(matrix),len(matrix[0])4res=[]#存放遍历后的结果5startx=starty=067foroffsetinrange(min(m,......
  • Educational Codeforces Round 152 (Rated for Div. 2)E. Max to the Right of Min(数
    题目链接:https://codeforces.com/problemset/problem/1849/E 大致题意: 长度为n的序列,求有多少个区间满足区间最大值在区间最小值的右边? 解题思路: (此题有使用线段树等其他做法,本处使用的是单调栈做法) 我们先求出每个a【i】的左边的比他小的LMIN,左边比他大的LMAX,右......
  • 后缀数组典题
    后缀数组典题约定:\(sa_i\)表示将所有后缀排序后第\(i\)小的后缀的编号,\(rk_i\)表示后缀\(i\)的排名,\(hgt_i=lcp(sa[i],sa[i-1])\)[NOI2016]优秀的拆分求一个字符串的子串能被拆成\(AABB\)形式的方案数,其中\(A,B\)均为字符串(\(|S|\leq300000\))。\(O(n^2)\)枚举......
  • 多行多列合并成一列内存数组的结果
    问题:多行多列合并成一列内存数组的结果函数公式解决:{=PHONETIC(OFFSET(A1:E1,ROW(1:23)-1,))}用Offset函数生成一个多维引用,每个平面分别是A:E表的每一行。利用Phonetic函数将每个平面里的内容进行合并。此公式的缺陷在于被合并的内容只能是文本,如果数据源中包含数值、日......
  • 「算法与数据结构」梳理6大排序算法 为了offer!
    6种排序如下......
  • flutter中通过遍历一个数组,给每个元素添加一个开关按钮怎么写
    要通过遍历一个数组给每个元素添加一个开关按钮,你可以使用ListView.builder来构建一个包含开关按钮的列表。下面是一个示例,展示了如何遍历一个数组并为每个元素添加一个开关按钮:List<bool>switchValues=List.generate(5,(index)=>false);ListView.builder(itemCount:sw......
  • 【数据结构机试】树
    存储&访问一般的树vector<int>v[N];voiddfs(intu){for(autox:v[u]){...dfs(x);}}二叉树intL[N],R[N];//表示左右儿子的值分别是多少至于编号,结点\(i\)的左儿子\(2i\),右儿子\(2i+1\)树的遍历一般的数分为先根(先访问根,后访问儿子)、......