常用数据结构:线性结构-1

上一篇 / 下一篇  2012-05-04 11:17:40 / 个人分类:杂谈

数据结构是计算机存储、组织数据的方式。常见的数据结构分类方式如下图:

51Testing软件测试网 h*`Re%P~

  常用的线性结构有:线性表,栈,队列,循环队列,数组。线性表中包括顺序表、链表等,其中,栈和队列只是属于逻辑上的概念,实际中不存在,仅仅是一种思想,一种理念;线性表则是在内存中数据的一种组织、存储的方式。

W$W#t,Nw9vw0

  顺序表

/u vEK:ha(r0

  顺序表将元素一个接一个的存入一组连续的存储单元中,在内存物理上是连续的。如下图:

5Q:n!h0hdECx&u0

2j Rc!?n o0

   顺序表存储密度较大,节省空间;但需要事先确定容量,在时间性能方面,读运算较快,时间复杂度为O(1);查找运算为O(n/2),和链表同样;插入运 算和删除运算如果要操作中间一个元素,比如3,那么就需要把3后面的元素全部进行移动,因此时间复杂度相对链表要大一些,插入时间复杂度最好为O(0)或 最坏为O(n);删除时间复杂度为O([n-1]/2);

9y1X u;Y/]2p9x0

  链表

M"L$F JB{+s;D0

  链表拥有很多结点,每个结点前半部分是数据域,后半部分是指针域,指针域指针指向下一个结点;链表可分为单链表、循环链表和双链表。51Testing软件测试网+g/`@!yoz2Om

  单链表:51Testing软件测试网;HHZ I&Y zfq

P\ v0C-Cj$N0

  从上图可以看出,单链表的上一个结点指针指向下一个结点,最后一个结点的指针域为null。

#k-|6n+SS/B#m }0

  结点的删除:51Testing软件测试网G]@(R+PO6Dz

1d Z'P+g_I/T0

  删除一个结点,如删除上图中q结点,只需将p结点中的指针域指向a3,然后将a2释放掉(free)即可。51Testing软件测试网4?3C^:H#e9T

  结点的插入:

mZp$L)x{/^sG;V0

&x8B,LWjn%`v0

  插入一个结点,如插入上图中s结点,首先将s的指针域指向a2(也就是把s的next赋值为p的next),然后将p结点的指针域指向x即可(p的next指向x)。51Testing软件测试网%VqK,eG'S$N[

 循环链表

NyD6[JE|2o#a,J@u0

k i,F(^9fX0

  循环链表与单链表唯一不同之处是,循环链表的最后一个结点指针不为空,而是指向头结点。结点的插入和删除和单链表非常相似,就不再示范了。51Testing软件测试网~&A ^KxD7b j

  双链表

@*x s P i.h|e0

4Vm0^,[!bfD0

  双链表拥有一前一后两个指针域,从两个不同的方向把链表连接起来,如此一来,从两个不同的方向形成了两条链,因此成为双链表。因此,双链表的灵活度要大于单链表。

hMin @*bz}m"I0

  结点的删除:

9~k+O|X$W0

51Testing软件测试网$^8s,j @ ]9ApX

  双链表的操作比单链表要稍显复杂(按照单链表思路来做其实也不难),如上图,要删除p节点,首先需要将a1的后驱指向a3,然后将a3的前驱指向a1,最后将p节点释放掉即可。

N&Y5o L \'w\-S"u(G3n0

  结点的插入:51Testing软件测试网&ynP4_\lZ FG

fS F;i^ {2vrd0

  如上图,插入q结点,首先要按照方向,将步骤拆分,首先将q节点的前驱指向p结点后驱,紧接着将x后驱指向a2;然后按照顺序完成图中所示的3、4步即可。

6c#G6?2dSJ5hD6p0

  从空间性能来看,链表的存储密度要差一些,但在容量分配上更灵活一些。从时间性能来看,查找运算与顺序存储相同,插入运算和删除运算的时间复杂度为O(1),要更优于顺序存储,但读运算则弱一些,为O([n+1]/2),最好为1,最坏为n。51Testing软件测试网;{Y3?,}-`

  栈51Testing软件测试网6T"_/Y*Go i^?

  上面提到栈属于一个逻辑概念,栈的实现可以用顺序也可以用链式。它遵循先进后出原则,如下图:

9Tb}X)b0

s][$y;V+NN2N.O y)?0

  Java测试代码如下:

9~4l)~ Urp0

A$e3e"Vd0Ab#t D0
  1. package com.snail.test;  
  2.  
  3. import java.util.Stack;  
  4.  
  5. public class TestStack {  
  6.  
  7.     public static void main(String[] args) {  
  8.           
  9.         Stack<String> stack = new Stack<String>();  
  10.         stack.push("NO1");  
  11.         stack.push("NO2");  
  12.         stack.push("NO3");  
  13.           
  14.         System.out.println("初始数量:" + stack.size());  
  15.  
  16.         while(!stack.isEmpty()){  
  17.             System.out.println(stack.pop());  
  18.         }     
  19.           
  20.         System.out.println("取完后的数量:" + stack.size());  
  21.     }  
  22. }
 
juD'sSb }iF0

TAG:

 

评分:0

我来说两句

Open Toolbar