三种基本的数据结构,来稍微说一下。
首先链表,这个几乎每本C++的语言书都会说的,直接看书上说的就好。
链表就是一个链,每一个都有一个指针指向下一个,然后这样串了起来。然后可以从头开始找,一直找到尾巴。然后对于某个数据点,都可以删除,只需要让他前面那个指向他后面那个,这样从头开始找的时候就找不到这个点了。。。在这个点之后添加一个点也是这样,直接让这个点指向那个新的,然后让新的指向原来这个点指向的后一个。。。
可以想象就是一个个点,然后第一个指向第二个,第二个指向第三个。。。就像是一条长长的链一样。。。
然后说一下实现的方法,一般C++的书上的实现方法是弄一个结点类,然后里面包含一个指针,表示指向下一个点,然后通过new和delete去搞。。。这种具体的实现方法建议看看书上的就行,这里不多说了这种。
因为链表用到的地方实在不多,也就不多说了。
但是他也是可以很灵活的,比如说在增加一个指针指向前面,这样就能向前找了。再比如形成一个网状的链表,每个点四个指针指向上下左右,这个东西叫做Dance Link()
然后是队列。
队列就是像真的队列一样,谁先来谁先买菜。先进先出,First in,First out。
然后应用到了计算机领域就是往一个东西里面赛东西,也拿东西。然后拿到的只能是最先塞进去的那个。
然后使用的话有一个STL里面的队列,queue,这个可以自行百度去学习。一般来说使用这个就够了,但是对于ACM来说,如果还想要速度更快的话,就开一个足够大的数组,然后模拟一个,代码如下:
int que[100010]; int first,last; void init() { first=last=0; } void push(int x) { que[last++]=x; } int pop() { if(last>first) return que[first++]; else return 0; }
que数组用来存数据,first表示开头那个的位置,last表示最后那个后面一个位置。
这样的话 last<=first 的时候就表示队列是空的了。
pop函数就是取队列的第一个元素,push就是往队列里面仍东西。
这里还要注意init,需要初始化才能使用。
队列的用处比较大,BFS就是典型的应用(BFS在另一篇有说。)。
然后队列的升级版比如 优先队列,单调队列,都是很有用的数据结构,之后也会学习到。
然后就是栈:
栈的话和队列正好相反,队列是先进去的先出来,栈的话是先进去的最后出来,最后一个进去的先出来,First in,Last out。
就好像是一个箱子,往里面一本本的放书,然后最先放的在最下面,需要他上面所有的拿出来才能拿这本。
然后STL里面也有 stack 来用。
也说一下对于ACM来说,如果是自己实现的话,也是开一个足够大的数组。
int stack[100010]; int top; void init() { top=0; } void push(int x) { stack[top++]=x; } int pop() { if(top) return stack[--top]; else return 0; }
各个函数的意义同上,top表示最上面那个元素之后一个的位置,所有top=0表示里面是空的。
栈的话用的也很多,其实函数的递归调用就是编译器通过栈来实现的,操作系统里面也有很多地方用到了栈。DFS也可以自己通过栈来实现。
然后栈的升级版单调栈也是很常用的数据结构。
差不多就这些。但是只是这样单纯的说的话其实理解不深,建议大家最好跟着练习题去做。也就是在 http://acm.hust.edu.cn/vjudge/toIndex.action 这个网站的contest里面搜索SCUT SE 就能找到,有关栈的练习应该是第三场新生训练赛。