福州集训DAY3之——数据结构

数据结构一

 再说数据结构之前,我们先要回答几个问题:

    Q:我们学习信奥要学习什么??

    A:想必大家这个问题的答案总是很熟悉的吧——毫无疑问!主要学习的就是算法和数据结构这两个板块。但是从这个答案中就可以知道数据结构的重要性了——地位可是占据整个信息学的二分之一啊!!!所以,大家一定也要好好学数据结构啊(虽然我也没学好。)

 

   Q:你知道的数据结构有哪些??
   A:这应该就比较好回答了吧??例如队列啊,栈啊,树啊,链表啊,图啊等等的。当然这些提过的数据结构是全部要学的。

 

好,那么我们接下来就分块来讲数据结构。

 

 

一、线性表

  1)顺序结构

  线性表可以用普通的一维数组存储。

  你可以让线性表完成以下操作:

    1.返回元素个数,也就是说数组中有多少元素。

    2、判断线性表是否为空。

    3、得到位置为P的元素。

   4、查找某个元素。

   5、插入、删除某个元素:务必谨慎使用,因为他们涉及大量元素的移动。

(注:操作4和5的时间复杂度都是O(n)的)

2)线性表(链式结构)

  i)单链表

    I、定义:下面有一个空链表,表头叫head,并且表内没有任何元素。

   struct node

   {

      int value;

      node*next;

}arr[max];

node *head=NULL;(当然这个可以先不管)

 

 

3)静态链表(用于图的邻接表)

  指针的作用就是存储地址。如果我们找到了替代品,就可以放弃指针了。而我们的替代平就是数组的下标来代替存储的地址。

 怎么存储、删除、插入元素就不说了。总体讲还是遍历和查找重要一点。所以代码的话就给遍历的了

 

那么遍历代码如下:

   for (inti=first[i];i!=0;i=next[i])

      cout<<a[o0<<endl;

这段代码其实也蛮好理解的,学过邻接表的人应该会很清楚,就不介绍了。

 

那么这就是线性表,其实简单地说就是一个数组吧,在进行一系列的变化而成。

 

二、栈

I:普通栈:

1、操作规则:先进后出,先出后进。

2、一些常见操作:

  1)定义:int stack[N],top=0//top表示栈顶位置。

  2)入栈:inline void push(int a) {stack[++top]=a;}

  3)出栈:inline int pop(){return stack[--top];}

  4)栈空条件:inline bool empty(){return top<1;}

 

其实栈的基本操作就只有这么四条,其他都是按题意略加改变。

 

II:单调栈:

1) 定义:顾名思义,单调栈就是站立的元素是单调的,单调递增或递减。通过一种单调性,我们可以快速解决一些问题。

 

2)例题:

  乱头发节

    i:题意描述:给定n头牛,第i头牛能看到它右边开欧式的所有连续的比他矮的牛。问所有牛看到的牛的总和是多少?

 

  ii:思路分析:暴力??好像是可以,不过只能40分,最关键还是单调栈。

    我们采用逆向思维,对于第i头牛来说,如果它是第一个比k头牛高的牛,那么第k头牛能看到的牛的总数就是i-k-1.当然,可以把第i头牛左边的所有满足以上条件的牛找出来。按编号排序,这些牛的高度是严格一次递减的。维护这种关系的结构就是单调栈。

 

  iii:算法过程如下:

   1、如果当前元素大于等于栈顶,那么栈顶出栈,统计栈顶看到多少只牛。

   2、如果栈为空,或当前元素比栈顶小,当前元素出栈。

  iiii:时间复杂度分析:每个元素只会近一次栈,出一次站,所以复杂度为O(n)

 

好,那么这题的代码你们就自己去写吧,我就不贴了。

 

 

那么这就是今天的内容。明天我还会写一些关于数据结构的博客。有没有觉得这样一分析,数据结构变简单了很多呢??

 

 

猜你喜欢

转载自blog.csdn.net/huang_ke_hai/article/details/79284929