堆和栈从操作系统和数据结构中加以区别:
从OS:堆需要程序猿分配内存空间,比如使用malloc函数来进行动态分配,其内存空间可以使不连续的,从链表中查找,大小可*分配,比如在C语言中定义的指针类型的变量,便是需要程序猿进行自行分配内存大小,显然速率偏慢;而栈则是编译时计算机进行分配,是一段连续的内存空间,大小只有2M左右,速率相对较快,在C语言中 函数的参数从右往左入栈,然后是局部变量,注意静态变量不入栈。
从数据结构:堆是一个数组对象,比如堆排序,二叉树之类的,还有运用于优先级队列,比如基于最大堆和最小堆;而栈则是基于一个LIFO规则的数据结构,只有一个口,叫做栈顶,其进行的操作(PUSH and POP)也都是在栈顶进行。
队列:队列有两个口,作用于队列上的INSERT操作,称为入队(ENQUEUE),其称作为队尾,作用于队列上的DELETE操作,称为出队(DEQUEUE),其称为对头,队列是遵循FIFO规则,最新插入的元素将会是最新被删除的元素。循环队列值得是队列中的元素形成环形,队尾的最后一个元素和对头的元素相接,此时若试图插入新元素,便会出现队列上溢,既然有队列上溢,自然而然就有队列下溢,所谓的队列下溢,便是当队列为空时 ,执行DELETE操作。
链表和数组的区别:
链表:链表中的各对象是按线性排序的,顺序由各对象中的指针决定,其的内存空间可以不连续,是由一个个节点组成的,node=data+node next ,也就是每个节点都会有数据和节点指针,有一个头节点指向后面的节点,最后一个节点指向NULL,链表的长度是可伸缩的,对数据操作方便,但访问困难。此外,链表还增加了结点指针域,开销相对较大。有单向链表和双向链表
数组:数组也是线性排序,但顺序是由下标决定的,其的内存空间是连续的,在定义时必须给出数组大小,分配内存空间,数组对数据的访问简单,但对数据的操作困难。
2014.12.4更新:(1)数组栈的创建,push,pop,peep,swap;
(2)链表栈的创建,push,pop,peep,swap;
(3)栈计算后缀表达式;
(4)仙人掌栈(多个分栈);
(5)MTFL(most to front list)模型用于搜索;
(6)栈的回溯算法,不断地压栈和弹栈