数据结构基础,STL(8)

1 篇文章 0 订阅
0 篇文章 0 订阅

一、数据结构基础

1.1 简介

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

1.2 知识点

1.2.1 线性结构

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

1.2.2 线性表的定义

在这里插入图片描述
如上图,这里我就不再说了,嘻嘻!

在这里插入图片描述

线性表其他知识点

线性表的顺序表示和实现
线性表的顺序表示又称为顺序存储结构或顺序映像
顺序存储定义
在逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构简言之,逻辑上相邻,物理上也相邻。
顺序存储方法
在这里插入图片描述
打字太慢了,用图片吧,嘿嘿!

1.2.3 单链表

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

实现方法

链表可以用指针实现,也可以用数组实现,我们今天着重说说用数组实现的方法。如下图:
在这里插入图片描述
定义函数 getpos(i) 返回链表中第 i 个元素在 value 数组的存储位置,输出第 i 个元素就是可以用 cout<<value[getpos(i)] ,而函数 getpos 在链表中实现,如下图:

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

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

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

单链表 插入&删除 操作

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

例题

在这里插入图片描述

代码
#include<bits/stdc++.h>
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 循环链表

循环链表是另一种形式的链式存储结构,它的特点是表中最后一个结点的指针指向头结点,整个链表形成一个环。由此,从表中任意一结点出发,均可找到表中其它结点。如图:
在这里插入图片描述
循环链表的操作和单链表的操作基本上一样,这里就不再说了。

1.2.5 双向链表

在双向链表的结点中有两个指针域,一个指向直接后继,一个指向直接前驱,可以在前面单链表中增加前驱数组 pre[ ]。
双向链表也可以有循环表,如下图:
在这里插入图片描述
但在双向链表中,插入和删除操作与单链表有很大不同,需要同时修改两个方向上的指针,如下图:在这里插入图片描述

实现方法

插入

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

删除

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

过程图
在这里插入图片描述

题目

看一下就行了,没有代码,哈哈哈!!!
在这里插入图片描述

1.2.6 栈

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

基础题

在这里插入图片描述
答案在文章最下面。

栈的基本操作

在这里插入图片描述
在这里插入图片描述

例题

在这里插入图片描述

代码

我的代码有点儿小问题(嘻嘻),把上课的图片拿出来了。
在这里插入图片描述

1.2.7 队列

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

队列的基本操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题

在这里插入图片描述

代码
#include<bits/stdc++.h>
#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 循环队列

在这里插入图片描述

*1.2.9 单调栈

在这里插入图片描述
*1.2.8 循环队列1.2.9 单调栈NOIP提高组(CSP-S提高级) 范围,在此仅仅提一下。

二、STL(标准模板库)

2.1 简介

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

2.2 大概内容

一共分为三类:第一类容器,第二类算法,第三类模板
在这里插入图片描述

2.3 具体内容

2.3.1 向量(vector)

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

定义

在这里插入图片描述

访问

在这里插入图片描述

常用函数

在这里插入图片描述

2.3.2 栈(stack)

在这里插入图片描述

2.3.3 队列(queue)

在这里插入图片描述

2.3.4 集合(set)

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

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

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

定义

在这里插入图片描述

访问

只能用迭代器 iterator 访问

常用数组

在这里插入图片描述

2.3.5 优先队列

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

定义

在这里插入图片描述

*堆

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

//升序队列,小顶堆
	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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值