一.堆栈:
堆栈我们先分开来说:
栈: 前面我们说过的8种基本数据类型和对象的引用变量,它们的值就存放在栈中。当它们除了作用域后会被自动释放。而且栈的存储速度快。数据可以共享,但是存在栈中的数据大小与生存期必须是确定。(它的共享理解与String pool一样)
堆:我们用new创建的对象和数组,它们在堆中分配内存。当它们不指向任何对象时,在随后的不确定的时间内,由java虚拟机来进行回收。堆的存储速度比栈慢,数据不可以共享,但是堆中的数据大小和生存期可以不事先告诉编译器。
这两种概念应该有了一个大概的了解,我们所说的堆栈其实就是一种线性表,仅在一端进行添加删除元素,这时就得到了一个堆栈。
我们用图来演示一下在一端进行数据操作:
从图中我们可以看出元素只有一个出口,后进来的元素压着先进来的元素,当想使用B元素时,我们需要先把C元素弹出,才能得到B元素,这就是堆栈的使用原则:后进先出。
前面说过堆栈是一种线性数据结构。我们可以自己去实现一个Stack。这样会更好的帮助我们理解堆栈的使用原则,下面是我自己简要实现的部分功能(因为初学所以可能繁琐,请大家多多指点):
public class StackTest {
private Object[] stack;
private int counter;
public StackTest(){
stack = new Object[10];
counter = 0;
}
/**
* 压栈
* @param o
*/
public void push(Object o){
if(counter < this.stack.length){
this.stack[counter] = o;
counter ++;
}else{
Object[] statck = this.stack.clone();
this.stack = new Object[counter + 6];
this.stack = stack.clone();
this.stack[counter] = o ;
counter ++ ;
}
}
/**
* 返回顶部元素
* @return
*/
public Object pop(){
if(0 != counter){
counter--;
Object o = stack[counter];
stack[counter] = null;
return o;
}else{
return null;
}
}
/**
* 堆栈是否为空
* @return
*/
public boolean empty(){
return counter == 0;
}
}
测试:
堆栈的实现方式有很多,用我们前面学过的链表实现起来更简单。
二.队列:
如果只能在一端添加新元素,在一端删除元素时,我们就得到队列,队列也是一种线性数据结构。队列的操作原则是:先进先出。
用图来表示:
不论是堆栈还是队列它们的实现都是多种多样,队列我用LinkedList来实现:
public class QueueTest { private LinkedList list; public QueueTest(){ list = new LinkedList(); } public void put(Object o){ list.addFirst(o); } public Object get(){ return list.removeLast(); } public boolean idEmpty(){ return list.isEmpty(); } }
测试: