数据结构02之栈和队列

栈和队列是常用的数据结构之一;

栈主要有压栈和弹栈两个动作、此结构决定了它是先入后出的特点;栈只允许访问一个数据项也就是最后压入栈中的数据,android的每一个Activity就是栈的数据结构,所以我们每次返回都可以看到上次访问的Activity

队列相当于一个管道、可以想象成管道的两端一遍压入,一边输出、所以先进入管道的先出

public class Stack< T> {    
    

    //储存数据的栈   private StackNode< T> stack[];   
       
    //栈的最大容量   
    private int maxSize;   
       
    //栈的当前容量   
    private int size;   
       
    //不传参数,默认栈的最大容量为100   
    public Stack()   
    {   
        this(100);   
    }   
       
    public Stack(int maxSize)   
    {   
        //如果传入的参数小于或等于0,则设置最大容量为100   
        if(maxSize <= 0)   
            maxSize = 100;   
        this.maxSize = maxSize;   
    }   
       
    //初始化栈,在堆中先申请好内存空间   
    public void initStack()   
    {   
        StackNode< T>[] stackNodes = new StackNode[maxSize];   
        stack = stackNodes;   
        for(int i = 0; i < maxSize; i++)   
        {   
            stack[i] = new StackNode< T>();   
        }   
        //栈的当前大小为0   
        size = 0;   
    }   
       
    //栈的基本方法之一,获得栈顶元素   
    public StackNode< T> getTop()   
    {   
        //栈中没有元素,则返回空   
        if(size == 0)   
            return null;   
        return stack[size];   
    }   
       
    //栈的基本方法之一,入栈   
    public boolean push(StackNode< T> stackNode)   
    {   
        //栈已满,入栈失败   
        if(size >= maxSize)   
            return false;   
        size++;   
        stack[size-1] = stackNode;   
        return true;   
    }   
       
    //栈的基本方法之一,出栈   
    public StackNode< T> pop()   
    {   
        //如果栈已空,则返回null   
        if(size <= 0)   
            return null;   
        size--;   
        return stack[size];   
    }   
       
    //栈是否为空   
    public boolean isEmpty()   
    {   
        if(size <= 0)   
            return true;   
        return false;   
    }   
       
    //栈的基本方法之一,遍历栈   
     public void traverse()   
     {   
         for(int i = 0; i < size; i++)   
         {   
             System.out.println(stack[i].get());   
         }   
     }   
        
     public static void main(String []agrs)   
     {   
         Stack< String> stack = new Stack< String>();   
         stack.initStack();   
         stack.push(new StackNode< String>("Anybody1"));   
         stack.push(new StackNode< String>("Anybody2"));   
         stack.push(new StackNode< String>("Anybody3"));   
         stack.traverse();   
     }   
}  

 stackNode:

public class StackNode< T> {    
    

  //要存储的信息   

    private T info;   

       
    public StackNode()   
    {   
        this(null);   
    }   
       
    public StackNode(T info)   
    {   
        this.info = info;   
    }   
       
    //set方法   
    public void set(T info)   
    {   
        this.info = info;   
    }   
       
    //get方法   
    public T get()   
    {   
        return info;   
    }   
}  

 队列: 


class Queue   //队列类 
    { 
    private int maxSize; //队列长度,由构造函数初始化 
    private long[] queArray; // 队列 
    private int front; //队头 
    private int rear; //队尾 
    private int nItems;  //元素的个数 
//-------------------------------------------------------------- 
    public Queue(int s)           // 构造函数 
       { 
       maxSize = s; 
       queArray = new long[maxSize]; 
       front = 0; 
       rear = -1; 
       nItems = 0; 
       } 
//-------------------------------------------------------------- 
    public void insert(long j)    // 进队列 
       { 
       if(rear == maxSize-1)          // 处理循环 
          rear = -1; 
       queArray[++rear] = j;          // 队尾指针加1,把值j加入队尾 
       nItems++;                    
       } 
//-------------------------------------------------------------- 
    public long remove()          // 取得队列的队头元素。 
       { 
       long temp = queArray[front++]; // 取值和修改队头指针 
       if(front == maxSize)            // 处理循环 
          front = 0; 
       nItems--;                      
       return temp; 
       } 
//-------------------------------------------------------------- 
    public long peekFront()       // 取得队列的队头元素。该运算与 remove()不同,后者要修改队头元素指针。 
       { 
       return queArray[front]; 
       } 
//-------------------------------------------------------------- 
    public boolean isEmpty()     // 判队列是否为空。若为空返回一个真值,否则返回一个假值。 
       { 
       return (nItems==0); 
       } 
//-------------------------------------------------------------- 
    public boolean isFull()      // 判队列是否已满。若已满返回一个真值,否则返回一个假值。 
       { 
       return (nItems==maxSize); 
       } 
//-------------------------------------------------------------- 
    public int size()            // 返回队列的长度 
       { 
       return nItems; 
       } 
//-------------------------------------------------------------- 
    }  

 Main:

    public static void main(String[] args) 
       { 
    Queue theQueue = new Queue(5);   // 队列有5个元素 
    
       theQueue.insert(10);             // 添加4个元素 
       theQueue.insert(20); 
       theQueue.insert(30); 
       theQueue.insert(40); 
    
       theQueue.remove();               // 移除3个元素 
       theQueue.remove();               // (10, 20, 30) 
       theQueue.remove(); 
    
       theQueue.insert(50);             // 添加4个元素 
       theQueue.insert(60);           
       theQueue.insert(70); 
       theQueue.insert(80); 
       
    
       while( !theQueue.isEmpty() )     // 遍历队列并移除所有元素 
          {                            
          long n = theQueue.remove();   // (40, 50, 60, 70, 80) 
          System.out.print(n); 
          System.out.print(" "); 
          } 
       System.out.println(""); 

       }   

 

 

 

 

 

 

 

 

 

posted @ 2012-03-30 18:00  _公孓℡  阅读(148)  评论(0编辑  收藏  举报