1. 程式人生 > >資料結構 - 基於陣列的棧

資料結構 - 基於陣列的棧

棧Stack

 

*棧也是一種線性資料結構

*相比陣列,棧對應的操作是陣列的子集

*只能從一端新增元素,也只能從這一端取出元素

*這一端稱為棧頂

 

*棧是一種後進先出的資料結構(Last in first out)

*在計算機的世界裡,棧擁有著不可思議的作用

 

棧的應用:

  *無處不在的undo操作(撤銷)

  *程式呼叫的系統棧(執行程式時,當一個子過程執行完成之後,可以自動回到上層呼叫中斷的位置繼續執行下去背後的原因就是有著一個系統棧來記錄每一次呼叫過程中中斷的位置)

  *...

 

基於陣列實現的棧結構原始碼如下:

package stack;

public interface Stack<E> {
    
    public void push(E e);
    
    public E pop();
    
    public E peek();
    
    public int getSize();
    
    public boolean isEmpty();

}

package stack;

import array.Array;

/**
 * 基於陣列的棧結構的實現
 *
 * @author zhangtianci
 *
 * @param <E>
 */
public class ArrayStack<E> implements Stack<E>{
    Array<E> array;        //基於陣列的一個封裝
    
    /**
     * 建構函式
     *
     * @param capacity
     * 棧的容量
     */
    public ArrayStack(int capacity){
        array = new Array<>(capacity);
    }
    
    /**
     * 無參建構函式,預設容量為10
     *
     */
    public ArrayStack(){
        array = new Array<>();
    }
    
    /**
     * 獲取棧中元素的個數
     */
    @Override
    public int getSize(){
        return array.getSize();
    }
    
    /**
     * 查詢棧是否為空,為空則返回ture,反之false
     */
    @Override
    public boolean isEmpty(){
        return array.isEmpty();
    }
    
    /**
     * 向棧中壓入一個元素
     */
    @Override
    public void push(E e) {
        array.addLast(e);
        
    }
    
    /**
     * 彈出棧頂的元素
     */
    @Override
    public E pop() {
        return array.removeLast();
    }

    /**
     * 查詢棧的容量
     *
     * @return
     */
    public int getCapacity(){
        return array.getCapacity();
    }
    
    /**
     * 看一眼棧頂的元素
     */
    @Override
    public E peek() {
        // TODO Auto-generated method stub
        return array.getLast();
    }
    
    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append(String.format("Capacity = %d, size = %d\n", getCapacity(),getSize()));
        res.append("Stack: ");
        res.append('[');
        for(int i = 0; i < array.getSize(); i++){
            res.append(i);
            if (i != array.getSize() - 1) {
                res.append(", ");
            }
            
        }
        res.append("] top");
        
        return res.toString();
    }
    
}

為什麼getCapacity()方法沒有在介面中定義,卻在ArrayStack中定義?

因為只有在基於陣列實現的棧才有capacity這個概念,所以此時應該在ArrayStack中定義這個方法。

 

基於陣列的棧簡單複雜度分析

  * void push(E e)  : O(1) 均攤

  *E pop(E e)  : O(1) 均攤

  *E peek() : O(1)

  *int getSize() : O(1)

  *boolean isEmpty() : O(1)