棧和隊列

    在數據結構中,我們比較熟悉的有:數組,鏈表,樹,棧,隊列。那麼就這幾種基本的數據結構來說,也是存在一些應用上的區別的。

  • 數組,鏈表,樹:這幾種是最基本的數據結構,常常用來實際存儲數據。

  • 棧,隊列這兩種數據結構一般是用作程序員實現算法時的工具,在java中有一些jdk提供的類,是對相應接口的實現,比較抽象,且有訪問受限的特性。

1.棧

    棧一般基於數組或者鏈表來製作,數組和鏈表是棧中實際存儲數據所使用的數據結構。它最基本的特性是“先進後出,後進先出”,不滿足這條規則的數據結構不是棧。

    在java中jdk裏已經有一些實現的棧,或者具有棧的功能的更強大的類型。那麼爲了解棧的特性,我們基於數組DIY一個簡單的棧。

    思路:棧一般有一個棧頂指針top,指向棧頂元素的位置。實際存儲數據的結構我們使用數組。另外棧應該具有一些基本的操作,push(入棧),pop(出棧),peek(查看棧頂元素),isEmpty(棧是否空),isFull(棧是否滿)。

    下面是java代碼:

  //將域都設爲私有,只能通過公有的方法訪問,以滿足棧的訪問受限特性
  
  public class Stack{
     private int[] elements; //棧中存儲的元素是int型的,用int型數組來存儲
     private int top;        //棧頂指針,指向棧頂
     private int MAXSIZE = 20;    // 用於存儲數據的數組長度,也是棧的最大容量
      
     public Stack(){
      this.elements = new int[MAXSIZE];
      top = -1; 
      }
    
    //入棧
     public void push(int index) {
       stackElements[++top] = index;
      }
   //出棧
     public int pop() {
      return stackElements[top--];
      }

    //查看棧頂元素	
     public int peek() {
      return stackElements[top];
     }

     
     // 查看棧是否爲空
      public boolean isEmpty() {
       if (top == -1) {
       return true;//爲空
       } else {
	return false;
	}
     }
  
  }

    那麼這就是一個最簡單的棧。剛纔我們提到java中已經有一些內置的類,如LinkedList等等,這些類型從其提供的方法來看,既可以是棧也可以是隊列或者其他的數據結構。那麼如果我們的算法希望用到一個嚴格的棧。我們可以自己diy一個棧,像上面的程序那樣。同時,我們也可以自己寫一個類來封裝那些高級的類。將其設爲我們自定義類中的private域,然後封裝一些他的滿足棧特性的公有方法作爲接口暴露出來,供其他類訪問即可。

2.隊列

   隊列一般來說具有先進先出特性。那麼隊列一般也是基於數組和鏈表來實現的,也就是說其底層用來實際存儲數據的數據結構也是數組或者鏈表。

   那麼,一般來說,隊列有基礎隊列,循環隊列,雙端隊列,優先級隊列。後兩種隊列就不再具有先進先出的特性了。但是其也是基礎隊列的變種。

   雙端隊列,簡單來說就是兩邊都可以remove的隊列。

   優先級隊列呢,就是說數據在隊列中是有一個特定的順序的,所有插入時,要先排序,再從指定位置插入,所以不再是隻能從rear隊尾插入。其他的和基礎隊列都是類似的。

   下面我們diy一個簡單的循環隊列。

//一個循環隊列,先進先出,基於數組實現、
//
public class Queue {
    private int MAXSIZE;//隊列的最大長度
    private long[] elements;
    private int front;//指向隊首位置
    private int rear;//指向隊尾位置
    private int nums;//隊列中實際元素的個數,可用於判斷隊列空滿狀態
	
	public Queue(int MAXSIZE) {
		this.MAXSIZE = MAXSIZE;
	    elements = new long[MAXSIZE];
		this.front = 0;
		this.rear = -1;
        this.nums = 0;
	}

	public void add(long ele){
		if(rear==(MAXSIZE-1)){
			rear = -1;
		}
		elements[++rear] = ele;
	    nums++;
	}

     
    public long remove(){
    	long temp = elements[front++];
		if(front==MAXSIZE){
			front = 0;
		}
		nums--;
		return temp;
    }
    
    public long peek(){
    	return elements[front];
    }
    
    public boolean isEmpty(){
    	if(nums==0){
    		return true;
    	}else
    		return false;
    	
    }
    
    public boolean isFull(){
    	if(nums==MAXSIZE){
    		return true;
    	}else{
    		return false;
    	}
    	
    }

}

    那麼以上就是隊列和棧的簡單理解了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章