菜鸟的学习之路(11) — 堆栈与队列

一.堆栈:

         堆栈我们先分开来说:

                 栈: 前面我们说过的8种基本数据类型和对象的引用变量,它们的值就存放在栈中。当它们除了作用域后会被自动释放。而且栈的存储速度快。数据可以共享,但是存在栈中的数据大小与生存期必须是确定。(它的共享理解与String pool一样)

      

                 堆:我们用new创建的对象和数组,它们在堆中分配内存。当它们不指向任何对象时,在随后的不确定的时间内,由java虚拟机来进行回收。堆的存储速度比栈慢,数据不可以共享,但是堆中的数据大小和生存期可以不事先告诉编译器。

            这两种概念应该有了一个大概的了解,我们所说的堆栈其实就是一种线性表,仅在一端进行添加删除元素,这时就得到了一个堆栈。

            我们用图来演示一下在一端进行数据操作:

                                       菜鸟的学习之路(11) — 堆栈与队列_第1张图片

                                      从图中我们可以看出元素只有一个出口,后进来的元素压着先进来的元素,当想使用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;
     }
}
 
 
测试:
             菜鸟的学习之路(11) — 堆栈与队列_第2张图片


  堆栈的实现方式有很多,用我们前面学过的链表实现起来更简单。

二.队列:

         如果只能在一端添加新元素,在一端删除元素时,我们就得到队列,队列也是一种线性数据结构。队列的操作原则是:先进先出

           用图来表示:

             菜鸟的学习之路(11) — 堆栈与队列_第3张图片

            

            不论是堆栈还是队列它们的实现都是多种多样,队列我用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();
        }
}
 
测试:
菜鸟的学习之路(11) — 堆栈与队列_第4张图片

 

           

 

 

你可能感兴趣的:(java)