首页 > 其他分享 >数据结构总结

数据结构总结

时间:2023-09-30 09:45:04浏览次数:25  
标签:总结 队列 pop ++ tail 数组 push 数据结构

数据结构

数组 array

·数组有维度之分, 是十分重要的数据结构, 最简单的数组是一维数组, 其逻辑结构为线性表.

·数组的特点: 插入删除是 $O(n)$ 的, 但是可以随机下标访问.

STL中的可变长度数组 vector

基础操作

<vector>
vector <int> v;
vector <int> :: iterator it;
v.push_back(x); v.pop_back();
v.front(); v.back(); v.begin(); v.end();
v.size(); v.empty(); v.clear(); v[k];

遍历

for (auto x : v) // v数组的值不改变
	x++;

for (auto &x : v) // v数组的值改变
	x++;

链表 list

·链表也是线性表的一种, 但是它不按照线性的顺序存储数据, 而是存放到下一个元素的指针.
·可以实现 $O(1)$ 的插入, 但是不支持随机查询任一元素.

·链表的特点: 插入删除迅速, 不支持随机下标访问.

链表的实现

使用数组实现.

常见应用及例题

存图(链式前向星), 约瑟夫问题.

栈 stack

·栈是一种特殊的线性表, 只能在一端插入 / 删除.

·被弹出栈的数据总是栈中所有数据中最后进来的那个,这种储存数据的方法叫做先进后出(FILO, First In Last Out).

基础操作

·最上面的元素被称为栈顶 (top).

·把一个元素放到栈的最上面被称为压入 (push).

·把栈顶从栈中删除被称为弹出 (pop).

栈的实现

建议数组模拟.

int stack[100010], top = 0;

void push(int x) {
	stack[++top] = x;
}

int pop() {
	return stack[top--];
}

常见应用及例题

维护递归, 实现 \(dfs\), 单调栈优化 \(dp\), 括号匹配.

STL中的栈 stack

<stack>
stack <int> st;
s.push(x); s.pop(); s.size(); s.empty();

单调栈

队列 queue

·队列也是线性表.

·被移除队列的数总是队列中最早进来的那个, 这种储存数据的方法叫做先进先出 (FIFO, First In First Out).

·如果每次入队出队都是由 $head++$ $tail++$ 完成, 会出现队列 "假溢" 的情况.

·我们可以尝试循环的利用队列的空间, 这就被称作循环队列.

·循环队列很简单, 当指针移动到数组最后一个元素的时候让它回到第一个就好了.

基础操作

·队列最前端的数叫做队头(front), 最后端的数叫做队尾(back).

·入队(push): 在队列最前端的前面加入一个数.

·出队(pop): 把队列最后端的数移出队列.

队列的实现

数组 \(q\), 这是队列的本体.
\(head\) \(tail\) 分别表示队头的下标和队尾的下标.
入队和栈一样, 若要加入数 \(x\), 让 \(tail++\), 然后给 \(q[tail]\) 赋值为 \(x\) 即可.
出队只需让 \(head++\).

int q[100010], head = 1, tail = 0;

void push(int x) {
	q[++tail] = x;
}

int pop() {
	return q[head++];
}

循环队列的实现

if (tail == n + 1) tail = 1; q[tail] = x;

STL中的队列 queue

<queue>
queue <int> q; q.push(x) q.pop();
q.front(); q.back(); q.size(); q.empty();

单调队列

即队列元素单调递增 (或递减), 是一个 \(O(n)\) 的算法.

单调队列的实现

实现 (递增): 插入 \(x\) 时若队尾元素比 \(x\) 大, 则不断将队尾元素弹出.

void push(int x) {
	while (tail >= head && que[tail] <= x) tail --;
	st[++tail] = x;
}

标签:总结,队列,pop,++,tail,数组,push,数据结构
From: https://www.cnblogs.com/Gmor-cerr-blog/p/17737625.html

相关文章

  • 算法总结
    排序Quick_SortvoidQuick_Sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[(l+r)>>1];while(i<j){doi++;while(q[i]<x);doj--;while(q[j]>x);if(i......
  • 每日总结9月21日
    今天体育课跑50米差点没给我肠子跑出来,浑身疼,太缺乏锻炼了,从明天开始多锻炼吧,我的父亲来石家庄开会,中午就没有留在学校,下午的数据结构的栈有些难度,不太好懂,离散就更别提了,跟上个学期学的内容像两门课......
  • 每日总结9月22日
    早上历经早八的英语课还考了单词后,人已经麻了,好在今天就没有其他的课了,我爸也是开完会下午的票就要回去了,我就带着他在省博物馆绕了很长时间还在那边的促销书摊上全款提了一套三体,在送我爸进火车站的时候,幸运的抢到了返程的高铁票,真的是完美的一天。......
  • 2023.9.29——每日总结
    学习所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,上午陪同学去医院,下午休息;我了解到的知识点:休息明日计划:休息......
  • 9.28每日总结
     将《软件构造》的作业进行了完善和更改,总算是改到了自己相对满意的程度;又学习了有关于Hive的相关知识;C#的页面设计又弄了弄;背单词!!!解决了之前一直困惑的问题; ......
  • 2023-2024 20231329 《计算机基础与程序设计》第1周学习总结
    作业信息  这个作业属于哪个课程<https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP>这个作业要求在哪里<https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01>这个作业的目标<快速浏览一遍教材计算机科学概论,课本每章提出至少一个自己不懂的或最想解决的问题并在......
  • 9. seqtk seqkit gtftk 总结
    1.背景  在前面小节我们使用了这些软件,因为混合使用比较让人混乱,这里总结理清楚一下.2.seqtk  功能总览如下图所示.2.1seq  这个功能主要是对\(.fasta\)和\(.fastq\)格式的文件进行格式化.\(-l\)  主要是让序列每行显示多少个碱基#每行显示60个氨基酸se......
  • python简写语法总结
    Lambdadefadd(a,b):returna+bprint(add(1,2))简写成add=lambdaa,b:a+bprint(add(1,2))[]推导式正常写法:s_list=[]foriinrange(5):s_list.append(i)print(s_list)简写:s_list=[iforiinrange(5)]print(s_list)判断正常写法:a=......
  • 2023-2024-1 20231416《计算机基础与程序设计》第一周学习总结
    第一次接触电脑就是安装虚拟机有一种拔剑四顾心茫然的无措之感但好在网上的虚拟机安装基础和同学们的帮助无疑是我的救命稻草virtualbxVMwareBIOS这都是我前所未闻的这一次作业我学到了很多还希望以后能更进一步1.在20世纪80年代末 并行体系结构出现 所有处理器共享同......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......