蒟蒻的数据结构乱谈(未完)

蒟蒻的辣鸡数据结构乱谈(不定时更新)

***我真是太弱了,什么也不会做,只好瞎谈一点简单的数据结构
注意:由于作者水平有限,前方将出现大量垃圾讲解,蒟蒻题目和指针***

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;
}

这个题就可以瞎写写过了
栈的知识大约就是这样,其他的简单习题可以到别的博主的博客里找一找学一学

队列

未完待续,不定时更新

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值