今天讲的是基本的数据结构,讲了链表,栈,队列,堆,STL的部分模板使用。
链表:是一种没有天生顺序关系的“数组”,是一种把零散的数据串起来的数据结构,它不依靠下标这种天生存在的数据关系串联数据,而是利用专门记录每个数据前后是哪个数据,把所有数据联系起来。专门记录每个数据前后是哪个数据是其方便插入和删除数据。但不方便其遍历。当开数组记录数据时有较多的空余,浪费,但又必须开这么大时,也可以用链表。
遍历元素:遍历链表1
for(int i=f[1];i!=0;i=a[i].z)
cout<<a[i].y<<endl;
插入元素:
next[px]=next[pa];
next[pa]=px;
删除元素:
next[pa]=next[px];
next[px]=0;
栈:栈是一种先进后出的容器先存进栈的元素比后存进栈的元素后出。
访问当前栈顶元素: s[top];
元素进栈:++top; s[top]=x;
栈顶元素出栈:--top;
队列:是一种先进先出的容器,先存进队列的元素比后存进队列内的元素先取出。要用两个变量记录队列的头和尾。
访问当前队首元素:q[head+1]
新的元素入队:++tail; q[tail]=x;
队头元素出队:++head;
普通队列:
队空条件: head=tail;
队满条件:tail=n-1;
队尾插入x:++tail; q[tail]=x;
队头出队:++head;
实际容量:tail-head;
环形队列:
对空条件:head=tail;
队满条件:(tail+1)%n=head;
队尾插入x:tail=(tail+1)%n; q[tail]=x;
队头出队:head=(head+1)%n;
实际容量:(n+tail-head)%n;
堆:是父亲值总比儿子值大或父亲值总比儿子值小的完全二叉树。按父亲、儿子数值的比较关系分为“大根堆”和“小根堆”。适合用于频繁查找序列中最值的问题。
调整:
void h(int x)
{
int child=x*2;
while(child<=n)
{
if(child<n&&a[child+1]<a[child]) child++;
if(a[x]>a[child])
{
swap(a[x],a[child]);
x=child;
child=x*2;
}
else break;
}
}
建堆:
void b()
{
int i;
for(int i=n/2;i>=1;i--)
h(i);
}
删除堆首元素:
void d()
{
if(n==1)
n=0;
else
{
a[1]=a[n--];
h[1];
}
}
插入新元素:
void intn(int k)
{
int x+=++n;
while(x>1)
{
if(k<a[x/2])
{
a[x]=a[x/2];
x/=2;
}
else break;
}
a[x]=k;
}
STL的部分模板使用还是上网查吧。