数据结构一
再说数据结构之前,我们先要回答几个问题:
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)
好,那么这题的代码你们就自己去写吧,我就不贴了。
那么这就是今天的内容。明天我还会写一些关于数据结构的博客。有没有觉得这样一分析,数据结构变简单了很多呢??