标签:出栈 src head 题目 turn 维护 png cout return
基本的数据结构小结,用数组代替指针
链表
链表和数组最大的不同是拥有 next值 并且各点在内存中彼此分散与内存的物理顺序无关。如果为a[5]={1,2,3,4,5};这时候每个值是按照顺序的排列 。
如果是a[5]={1,2,3,5,4};按照下标输出则是 1 2 3 5 4,此时用链表存储,a[4](值为4)的next标记为3,则输出a[a[4].next]的值就是5,而数组中值的位置都没有变化,给每个值都存储下一个值,可以按序输出。
静态链表
struct node
{
int value;
intnext;
}arr[MAX];
int top;//链表顶端
//插入
top++;
arr[top].value=q;
arr[top].next=arr[p].next;
arr[p].next=top;
//删除
int temp=a[p].next;
a[p].next=a[temp].next;
//查找.遍历
int temp=head;
while(temp)
{
cout<<a[temp].value;
temp=a[temp].next;
}
链表还有一种叫做双向链表,比刚才静态(单)链表多了一个前驱(prev)。这样不管是插入还是删除,都需要维护好三个关系, 这个数的本值,前驱,后继。并且双向链表的查找或遍历是可以从两个方向开始的。当向一个链表中插入数据的时候,不需要再数组中位置紧密排列,而记住前驱后继的序号即可,这种方法比腾出一位数组要方便的多。
循环链表,最后一个值的next和第一个值相同,第一个值的prev和最后一个值相同,构成了一个环。
栈
栈的存储特性:先进后出,先出后进。top表示栈顶,也就是每次数据进、出栈的时候top都会改变,top也表示一个栈中数据的多少。
int stack[N],top=0;
inline void push(int a){stack[++top]=a;}//入栈
intline int pop(){return stack[--top];}//出栈
inline bool empty(){return top<1;}//栈空
一般存储栈的题目会考察单调栈,单调栈中元素的值是按照升序或者降序排列的,所以在存入的时候会和stack[top]的值比较。例如 stack[5]={1,2,5,6},此时存入的top=3,stack[top]的值是6,如果把3存入,则需要删除值5和6,通过比较的出5、6比3大,top--(连续两次),此时top为1,然后存入stack[top++]的值是3
标签:出栈 src head 题目 turn 维护 png cout return
原文地址:http://www.cnblogs.com/Murs/p/7750460.html