初识 基本数据结构和stl

时间:2021-02-19 13:18:28   收藏:0   阅读:0

基本数据结构

双向链表

用数组模拟链表实现

双向链表初始化

l[1]=r[1]=0;r[0]=1;

结点1的左边和右边都是1,结点0的右边是1,为什么结点0会存在?因为后续元素有可能插入到结点1的前面

插入

将i插入到x的左边
r[l[x]]=i;l[i]=l[x];
l[x]=i;r[i]=x;
将i插入到x的右边
l[r[x]]=i;r[i]=r[x];
r[x]=i;l[i]=x;

删除

删除位置位x的元素

切换

从当前元素切换到下一个元素

x=r[x]

从当前元素切换到上一个元素

x=l[x]

应用——遍历

cur=0
do{
   cur=r[cur];
}while(cur!=0)

其他实现方法数组和指针

STL--变长数组vector

定义

vector<数据类型> 数组名;

添加数据

数组名.push_back(数据);

第i位数据的访问

v[i];

数组长度

清空数组

v.clear()

好处

相对于二维数组不用浪费多余的内存空间

STL--栈stack

定义

stack<数据类型> 变量名

进栈

栈名.push(x)

出栈

栈名.pop()

栈长度

栈名.size()

判断栈是否为空

栈名.empty()

应用——左右括号匹配问题

STL--队列queue

定义

queue<数据类型>队列名

入队

队列名.push(数据)

离队

队列名.pop()

队头

队列名.front()

队列长度

队列名.size()

判断队列是否为空

队列名.empty()

STL--双端队列deque

定义

deque<数据类型> 队列名

头/尾部进

队列名.push_front/back(数据);

头/尾部出

队列名.pop_front/back()

头/尾部出的前提

应用

单调队列的构造

给定一个n个数的数列,从左到右输出每个区间长度为m的数列段的最大数

#include<iostream>
#include<deque>
using namespace std;
int main()
{
	deque<int> deque1;
	int n,m;
	cin>>n>>m;
	int a[n+1];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		
		while(!deque1.empty()&&a[deque1.back()]<=a[i])
		    	deque1.pop_back();
		deque1.push_back(i);
		
		while(deque1.empty()!=1&&i-deque1.front()+1>m)
		    deque1.pop_front();
	    //if(i-deque1.front()+1==m)	deque1.front()有可能被更新掉
		if(i>=m-1) 
		    cout<<a[deque1.front()]<<" ";	    
	}
	return 0;
}

1714切蛋糕

技巧

二叉树

数组实现方式

前序遍历

void dfs(int x){
     cout<<x;
     if(l[x]!=-1)dfs(l[x]);
     if(r[x]!=-1)dfs(r[x]);
}

中序遍历

void dfs(int x){
     if(l[x]!=-1)dfs(l[x]);
     cout<<x;
     if(r[x]!=-1)dfs(r[x]);
}

应用——已知中序后序求前序

STL--优先队列

优先队列

  ``priority_queue<``int``,vector<``int``>,greater<``int``> >que3;``//注意“>>”会被认为错误, 
                           ``//这是右移运算符,所以这里用空格号隔开 

模板

priority_queue<int,vector<int>,greater/less<int> > pqx

在优先队列与结构体的结合

在优先队列中使用结构体的若干小结Goozy

模板

使用优先队列时,如果需要对Time中的start从小到大排序,有两种方法:

priority_queue<Time> pq;

一.在结构体外重载结构体小于运算符:

bool operator <(const Time& a,const Time& b){
 return a.start > b.start;
}  //这里以大于重载小于是因为默认情况下,优先队列是以大的作为队首,这样一反,就可以再默认情况下使得小的作为队首二.直接在结构体中重载小于运算符:

二.直接在结构体中重载小于运算符:

struct Time{  
 int start, end;  
 bool operator < (const Time& t)const{  
        return start > t.start;  
    }  //用大于号去重载小于号
   };  

其他

1e10和128M的关系

重载

register int

register 是表示使用cpu内部寄存器(寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件)的变量,而平时的int是把变量放在内存中,存到寄存器中可以加快变量的读写速度。

断环为链

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!