蒟蒻的辣鸡数据结构乱谈(不定时更新)
***我真是太弱了,什么也不会做,只好瞎谈一点简单的数据结构
注意:由于作者水平有限,前方将出现大量垃圾讲解,蒟蒻题目和指针***
1. 什么是数据结构
2. 简单的数据结构口胡
3. 简单数据结构模板
4. 蒟蒻题目乱做
大概要讲这些内容吧
什么是数据结构(Data Structure)
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
(
算了,这是我随便在网上粘的
反正看这个也看不太懂
说白了就是一种很屌的东西,把奇奇怪怪的数据组织起来,让它变得更高更快更强
我们下面就回来学习简单的数据结构(反正太难的我也不会)
我们从最简单的开始好了
栈
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
好吧,这又是瞎粘的,还是用正常的语言翻译一下
就好比把盘子叠成一叠,显然为了不让盘子被打碎,每次都要从这一摞的顶部放盘子或者取盘子
栈就是这样的数据结构,每次都只在顶部操作
显然会看栈的人大多数是初学者,显然我需要写的详细一些
#include<iostream>
#include<cstdio>
using namespace std;
int s[100000],top;
void push(int x)//推入栈
{
top++;
s[top]=x;
}
void pop()//弹出栈顶元素
{
top--;
}
int main()
{
}
你只需要维护一个栈顶的指针top,就可以乱搞了,每次调取都只调取s[top]就是栈顶元素了
这个东西也有stl来帮你实现
#include<iostream>
#include<stack>//栈的stl库
using namespace std;
stack<int>s;//定义一个int类型的栈s
int main()
{
s.push(1);//推入元素1到栈顶
s.push(-55);
cout<<s.top()<<endl;//输出栈顶元素
s.pop();//弹出栈顶元素
cout<<s.top()<<endl;
}
s不需要像数组一样指明大小,stl已经帮你做好增大数组的操作了
大概常用的操作就是这些
还有常用的操作有empty(),size()等等,想要了解的可以上网查询。
好吧,这个栈看起来什么用都没有
实际上,我们用栈是在维护一个数列的处理顺序
例题什么的就算了吧
下面我们学习一项更高级的栈(这个东西更能体现栈的用处,否则栈除了存储数据之外没有算法上的帮助)
单调栈
单调递增或单调减的栈,跟单调队列差不多,但是只用到它的一端,利用它可以用来解决一些ACM/ICPC和OI的题目,如RQNOJ 的诺诺的队列等。
这个是网上莫名其妙的定义
显然我们也不知道什么是队列,所以这个定义对我们没有什么帮助
通俗地讲,单调栈就是指一些满足如下条件的栈
- 从栈顶至栈底的元素单调递增或单调递减
是个栈
定义非常简单
[Usaco2006 Nov]Bad Hair Day 乱发节 题目传送门
题意
这个题目就是要我们大力找到每个牛所能看到的最远端点,然后大力一求和就可以了
但是找最远端点不能太大力,O(n^2)肯定爆炸
这时候使用单调栈就可以很好地解决问题
维护一个从栈顶到栈底单调递增的单调栈
怎么用呢?怎么维护呢?
每次按顺序添加牛的身高,如果比栈顶元素大,则 栈顶的那头牛所能看见的最远端点就是新加的这头牛,也就是之间的牛他都能看见,记录一下,并且将栈顶元素弹出,重复该过程,直到栈为一个空栈或者小于栈顶元素。
然后大力求和就可以了
来一波die马
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 80010
using namespace std;
long long ans;
struct fffff
{
long long val,id;//结构体便于整体存储数据
}s[MAXN];
long long top,h[MAXN],n,maxx[MAXN];
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&h[i]);
for(int i=1;i<=n;i++)
{
while(s[top].val<=h[i]&&top)
{
maxx[s[top].id]=i-1;
top--;
}
s[++top].val=h[i];
s[top].id=i;//大力插入
}
while(top)
{
maxx[s[top].id]=n;
top--;
}//剩下的牛是可以看见它之后的所有牛
for(int i=1;i<=n;i++)ans+=(maxx[i]-i);//大力求和
cout<<ans<<endl;
}
这个题就可以瞎写写过了
栈的知识大约就是这样,其他的简单习题可以到别的博主的博客里找一找学一学
队列
未完待续,不定时更新