數據結構之堆棧(stack)

棧簡介

  • 棧(Stack)是一種插入刪除操作都只能在一個位置上進行,這個位- 置位於表的末端,叫做棧頂(Top);
  • 對棧的基本操作有push和pop,表示進棧和出棧.也就相當於插入和刪除操作;
  • 棧結構又叫做LIFO(後進先出)表.歸根結底是一個表結構,因此任何能夠實現表結構的方法都能實現棧;
  • 在java語言中,ArrayList和LinkedList都支持棧操作,棧操作都是常數時間的操作,棧的實現方式一般有兩種,一種是使用順序存儲的方式,即使用數組來實現,用ArrayList可以輕易實現棧結構,也可以自己使用數組來實現,一會下面我就用數組來實現棧,第二種是使用鏈式存儲實現,即可以使用LinkedList來實現.
    基於數組實現的棧
/*
 * 後進先出(LIFO)或先進後出
 * 方法:
 * 1.進棧 push()
 * 2.出棧 pop()
 * 3. 獲取棧頂元素 peek()
 * 4. 棧的大小 size
 * 5. 擴容 
 * 使用泛型,以便棧中能夠存儲我們想要的數據
 * 基於數組的棧實現
 */
public class MyStack<E> {
    private Object[] stack;
   /*棧中元素的個數,這裏沒有對size1進行初始化,
    是因爲size是類成員變量,程序在實例化類的時
    候會把size初始化爲默認值0
    */
    private int size;         
    public MyStack() {
        stack=new Object[10];     //初始長度爲10
    }
//  判斷棧是都爲空
    public boolean isEmpty() {
        return size==0;
    }
//  返回棧頂元素
    public E peek() {
        if(isEmpty()) {
            return null;
        }
        return (E) stack[size-1];
    }
    public E pop() {
        E e = peek();   //獲取棧頂元素
        if(size>0) {
            stack[size-1]=null;   //將出棧後的位置置爲空
            size--;   //將棧中元素減一
        }
        return e;  //返回棧頂元素
    }
//   檢測棧是否滿,滿的話需要擴容
    private void ensureCapacity(int size) {
        int len = stack.length;
        if(size>len) {
            int newLen= len+10;       //每次擴容增10
            stack = Arrays.copyOf(stack, newLen);
        }
    }
    
    public E push(E e) {
        ensureCapacity(size+1);    //先進行擴容檢測
        stack[size++]=e;         //把元素加進數組最後末尾,並將元素個數size加1
        return e;         //返回該元素
    }
    
    public void printStack() {
        System.out.println("start print stack....");
        for(int index=0;index<size;index++) {
            System.out.println(stack[index]);
        }
        System.out.println("finish!");
    }
    
//  測試
    public static void main(String[] args) {
        MyStack<String> myStack = new MyStack<String>();
        
        myStack.push("as");
        myStack.push("c");
        myStack.push("d");
        
        System.out.println(myStack.pop());
        myStack.printStack();
    }
}

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