表、栈和队列

来源:互联网 发布:流星网络电视vip破解版 编辑:程序博客网 时间:2024/05/22 05:08

一、表

java中最常见的两个实现方式是:ArrayList和LinkedList。

1)ArrayList类提供了List ADT的一种可增长数组的实现。

优点是get和set的调用话费常熟时间。

缺点是新项的插入和现有项的删除代价昂贵。

2)LinkedList类则提供了List ADT的双链表实现。

优缺点和ArrayList相反。

其对get的调用是用next函数逐个查询的,代价很昂贵。


二、栈

栈是限制插入和删除只能在在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有push(进栈)和pop(出栈)。top操作是对栈顶的元素进行考察。对空栈进行pop或者top的时候,会出现ADT错误。

实现:ArrayList和LinkedList都支持栈操作,二者性能几乎无区别,都是快速的O(1)时间。

特点:如果需要调用最近的元素,就要应用栈。

应用:平衡符号,后缀表达式,方法调用。

方法调用:比如从一个方法跳转到另一个方法的时候,就要把原方法的参数,入口地址存入栈中。对于某方法使用了大量递归,可能导致栈溢出。


三、队列

像栈一样,队列也是表,然而使用队列时插入是在一端进行而删除是在另一端进行。基本操作有enqueue(入队,队尾插入),和dequeue(出队,对头删除)。

实现:ArrayList和LinkedList都支持队列操作,二者性能几乎无区别,都是快速的O(1)时间。具体操作是:让元素x入队时,我们让currentSize和back增1,置theArray[back]=x;若是元素出队,我们置返回值为theArray[front],并将currentSize和front减1.这有一个潜在的问题,比如说,十个位置的队列,队列已经使用的队尾,但是队列的前面的元素已经出队,实际上只有最后两位还有元素。简单的解决方法是使用循环数组实现,将back和front序号回绕。

特点:需要排队的地方,队列比较合适。