数据结构基础,STL(8)

一、数据结构基础

1.1 简介

在进阶的C++语言中,数据结构是一个必不可少的部分。
数据结构就是数据之间的结构或关系。
程序设计=算法+数据结构
数据结构是为算法服务的,所有的题目,必须先知道算法,再根据算法选相应的数据结构

1.2 知识点

1.2.1 线性结构

定义
若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。
可表示为A1,A2,A3…,An。
特点
1)只有一个首结点和一个为结点
2)除首尾节点外,其他节点只有一个直接前驱和一个直接后继,简言之,线性结构反映节点间的关系是一对一的。
线性结构包括:线性表、栈、队列、字符串、数组等等,最常用的是线性表

1.2.2 线性表的定义

数据结构基础,STL(8)_第1张图片
如上图,这里我就不再说了,嘻嘻!

数据结构基础,STL(8)_第2张图片

线性表其他知识点

线性表的顺序表示和实现
线性表的顺序表示又称为顺序存储结构或顺序映像
顺序存储定义
在逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构简言之,逻辑上相邻,物理上也相邻。
顺序存储方法
数据结构基础,STL(8)_第3张图片
打字太慢了,用图片吧,嘿嘿!

1.2.3 单链表

链表是用一组任意的存储单元存储线性表的数据元素,这一组存储单元不要求是连续的。构成链表的结点包括两个域:存储数据信息的数据域和存储直接后继的指针域,由于每个节点只包含一个指针域故称为单链表,如下图:
数据结构基础,STL(8)_第4张图片
上图答案应该难不倒大家,它连起来是:“NOI GOOD LUCK TO EVERY BODY”

实现方法

链表可以用指针实现,也可以用数组实现,我们今天着重说说用数组实现的方法。如下图:
数据结构基础,STL(8)_第5张图片
定义函数 getpos(i) 返回链表中第 i 个元素在 value 数组的存储位置,输出第 i 个元素就是可以用 cout<

int getpos(int i)
{
	int hd=head;
	for(int j=1;j<=i;j++)
	{
		hd=next[hd];
	}
	retuen hd;
}

在这里,我没有给图,为什么呢?

~
~
~
~
~
其实我也不知道为什么,呵呵!

单链表 插入&删除 操作

在单链表中,我们如何进行插入删除操作呢?
我们先来看两张图片:
数据结构基础,STL(8)_第6张图片
假设我们要在第 i 个元素前插入新的元素 x ,那么我们首先需要找到第 i-1 个元素对应的地址 p,新的元素地址为 q,那么我们只需要将 next[q] 设为 next[p] ,next[p] 设为 q 即可。
数据结构基础,STL(8)_第7张图片
在链表中删除与插入其实是类似的,假设我们当前要删掉第 i 个元素,我们要先找到第 i-1 个元素的存储地址 p,然后把 next[p] 设置为 next[next[p]] 即可。
插入删除,大家都了解完了,下面来看看例题吧。

例题

数据结构基础,STL(8)_第8张图片

代码
#include
using namespace std;
int n,value[2001],next[2001],head=0;
int getpos(int pos)
{
	int hd=head;
	for(int i=1;i<=pos;i++)
	{
		hd=next[hd];
	}
	return hd;
}
int cr(int pos,int val)
{
	int p=getpos(pos-1);
	value[++n]=val;
	next[n]=next[p];
	next[p]=n;
}
int sc(int pos)
{
	int p=getpos(pos-1);
	next[p]=next[next[p]];
}
int main()
{
	int m;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>value[i];
		next[i-1]=i;
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int type,val,pos;
		cin>>type>>pos;
		if(type==1) cout<<value[getpos(pos)]<<endl;
		if(type==2)
		{
			cin>>val;
			cr(pos,val);
		}
		if(type==3) sc(pos);
	}
	return 0;
}

1.2.4 循环链表

循环链表是另一种形式的链式存储结构,它的特点是表中最后一个结点的指针指向头结点,整个链表形成一个环。由此,从表中任意一结点出发,均可找到表中其它结点。如图:
数据结构基础,STL(8)_第9张图片
循环链表的操作和单链表的操作基本上一样,这里就不再说了。

1.2.5 双向链表

在双向链表的结点中有两个指针域,一个指向直接后继,一个指向直接前驱,可以在前面单链表中增加前驱数组 pre[ ]。
双向链表也可以有循环表,如下图:
数据结构基础,STL(8)_第10张图片
但在双向链表中,插入和删除操作与单链表有很大不同,需要同时修改两个方向上的指针,如下图:数据结构基础,STL(8)_第11张图片

实现方法

插入

	next[q]=next[p];
	next[p]=q;
	pre[next[q]]=q;
	pre[q]=p;

删除

	next[p]=next[next[p]];
	pre[next[p]]=p;

过程图
数据结构基础,STL(8)_第12张图片

题目

看一下就行了,没有代码,哈哈哈!!!
数据结构基础,STL(8)_第13张图片

1.2.6 栈

栈是一种操作(或者说运算)受到限制的特殊线性表,其操作都限制在表的一端进行。这一端被称为栈顶 top另一端称被称为栈底。插入操作一般被称为进栈 push 或者 压栈,删除操作称之为出栈 pop。栈的特点是先进后出。
如同洗碗,先洗好的碗在下面,后洗好的叠在上面。用的时候先用上面的碗。
栈的存储和实现方式,也有数组和链表两种,我们只说数组方式:
数据结构基础,STL(8)_第14张图片

基础题

数据结构基础,STL(8)_第15张图片
答案在文章最下面。

栈的基本操作

数据结构基础,STL(8)_第16张图片
数据结构基础,STL(8)_第17张图片

例题

数据结构基础,STL(8)_第18张图片

代码

我的代码有点儿小问题(嘻嘻),把上课的图片拿出来了。
数据结构基础,STL(8)_第19张图片

1.2.7 队列

队列也是一种操作(或者说运算)受到限制的特殊线性表。其插入操作限定在表的一端进行,称为入队;其删除操作则限定在表的另一端进行,称为出队插入的一端称为队尾,删除的一端称为队头。
数据结构基础,STL(8)_第20张图片
假设有队列 Q =(A1,a2,A3…An),则队列 Q 中的元素是按 A1,A2,A3…An 的顺序依次入队,也只能按照 A1,A2,A3…An 的顺序依次出队。因此,队列也被称作先进先出的线性表。
类似于现实生活中的排队购票,先来先买,后来后买。
看一下下面这张图:
数据结构基础,STL(8)_第21张图片

队列的基本操作

数据结构基础,STL(8)_第22张图片
数据结构基础,STL(8)_第23张图片
数据结构基础,STL(8)_第24张图片

例题

数据结构基础,STL(8)_第25张图片

代码
#include
#define MAXN 1010
using namespace std;
int a[MAXN],b[MAXN],front,rear;
int main()
{
	int m,n,k,t1,t2;
	cin>>m>>n>>k;
	for(int i=1;i<=n;i++)
	{
		a[i]=i;
	}
	for(int i=1;i<=m;i++)
	{
		b[i]=i; 
	}
	t1=m;
	t2=n;
	int x=0,y=0;
	for(int i=1;i<=k;i++)
	{
		x++;
		y++;
		cout<<a[x]<<' '<<b[y]<<endl;
		t1++;
		a[t1]=a[x];
		t2++;
		b[t2]=b[y];
	}
	return 0;
}
分析

显然,伴舞配对的顺序符合“先进先出”,所以用两个队列分别放放男士队伍和女士队伍,然后模拟k次配对:每次取各队队头元素“配对”输出,并进行“出队”和重新“入队”操作。

*1.2.8 循环队列

数据结构基础,STL(8)_第26张图片

*1.2.9 单调栈

数据结构基础,STL(8)_第27张图片
*1.2.8 循环队列1.2.9 单调栈NOIP提高组(CSP-S提高级) 范围,在此仅仅提一下。

二、STL(标准模板库)

2.1 简介

STL标准模板库,是一系列软件的统称。从根本上说,STL是一些“容器”的 集合,这些容器有list vector set map等。STL也是算法和其他一些组件的集合。

2.2 大概内容

一共分为三类:第一类容器,第二类算法,第三类模板
数据结构基础,STL(8)_第28张图片

2.3 具体内容

2.3.1 向量(vector)

Vector直接翻译为向量,可以看成是动态数组,即可以保存的元素个数是可变的,是OI选手经常使用的一种容器。

定义

数据结构基础,STL(8)_第29张图片

访问

数据结构基础,STL(8)_第30张图片

常用函数

数据结构基础,STL(8)_第31张图片

2.3.2 栈(stack)

数据结构基础,STL(8)_第32张图片

2.3.3 队列(queue)

数据结构基础,STL(8)_第33张图片

2.3.4 集合(set)

集合(set) 是容器的一种,其功能是将输入进去的值自动去重并递增排序,内部采用*红黑树实现。

注意:
set 只能用于迭代器访问
s.begin()返回集合的头

*红黑树:一种高级算法。

定义

数据结构基础,STL(8)_第34张图片

访问

只能用迭代器 iterator 访问

常用数组

数据结构基础,STL(8)_第35张图片

2.3.5 优先队列

普通的队列是一种先进先出的数据结构。元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先等级,当访问元素时具有最高等级的元素最先删除。优先队列具有最高级先出(first in,largest out)的行为特征。
优先队列具有队列的所有特性,包括队列的基本操作,只是在这些基础上添加了一个内部的排序,它本质是一个是的实现。

定义

数据结构基础,STL(8)_第36张图片

*堆

这里简单说一下有关优先队列的堆。

//升序队列,小顶堆
	priority_quouo <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
	priority_quouo <int,vector<int>,less<int> > q;

THE END

1.2.6 基础题 答案:1.B 2.B 3.D 4.B
好了,今天就说到这儿吧,毕竟已经说这么多了(再毕竟我还没有学呢,哈哈哈哈哈哈哈哈~)
这是我第二次写博客,总觉得跟第一次差不多,自我感觉良好。
*题目均来自JZOJ网站(39.98.198.136),照片均来自老师PPT,部分文字来自老师PPT

你可能感兴趣的:(数据结构,C++,STL)