线性表的顺序存储(顺序表)和链式存储(链表)

**

  • 线性表的顺序存储(顺序表)和链式存储(链表)

**
一、顺序表(SeqList)使用一维数组一次存放书元素。一维数组占用一块内存空间,每个存储单元的地址是连续的,通过下标识别元素,它的下标就代表了他的存储单元序号,也就表示了它的位置。
查找顺序表中的元素是方便的,根据下标就可以取出要取的元素。
当顺序表的容量不够时,顺序表不能就地扩容,要申请另一个更大容量的数组进行数组元素复制。Java源代码中的ArrayList类扩容实现过程是:先申请增加的容量是原本容量的二分之一,生成一个原本容量的二分之三的内存地址,再将所有元素进行复制过去。
对于插入、删除元素:先根据下标找到相应位置,若插入元素,将新插入插入位置后,将被加入位置的旧元素及之后的元素向后移动,移动次序是由后向前。若删除元素,将要删除的元素删除,其后的元素向前移动。插入和删除的操作时间主要用于移动元素。
二、线性表的链式存储结构(链表LinkedList)是用若干地址分散的存储单元存储数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻。存储一个数据元素的存储单元成为结点Node,单链表的表示方式:结点(数据域,地址域)。
对于单链表的操作:遍历操作是从第0个结点开始,沿着结点的Next链,依次访问单链表中的每个结点,并且每个节点只访问一次。插入(删除)操作:根据要插入(删除)的结点数,从第0个结点遍历找到要插入(删除)的位置,将要插入的数据元素插入(将要删除的元素删除),改变原来结点间的链接关系,不用移动数据元素。而操作所花的时间都在查找上面。
三、特殊的线性表(栈和队列)
(一)特殊之处在于插入和删除操作的位置受到限制:
若插入和删除的操作只允许在线性表的一端进行,则为栈(stack),特点是先进后出;
若插入和删除操作分别在线性表的两端进行,则为队列(queue),特点是先进先出。
(ps. 栈和线性表是不同的抽象数据类型,栈的概念不依赖于线性表而存在。)
(二)应用
栈是嵌套调用机制的实现基础:由于函数返回次序与调用次序正好相反,借助栈来实现记忆函数的路径,就能获得函数返回的路径,当函数被调用时,操作系统将该函数的有关信息(地址、参数、局部变量值等)入栈,称为保护现场;一个函数执行完返回时,出栈,获得调用函数信息,称为恢复现场,程序返回调用函数继续运行。
使用栈以非递归方式实现递归算法(存在直接或间接调用自身的算法称为递归算法);
队列用于处理排队等待问题。(优先队列)

你可能感兴趣的:(线性表的顺序存储(顺序表)和链式存储(链表))