Java棧的實現

棧定義

棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。
對棧來說,表尾端有其特殊含義,稱爲棧頂(top),相應地表頭端稱爲棧底(bottom)。不含元素的空表稱爲空棧。

棧的修改是按後進先出的原則進行的,因此,棧又稱爲後進先出(Last in first out)的線性表(簡稱LIFO結構)。

棧的屬性與方法

Java程序代碼實現

public interface IMyStack<T> {

    /*
     * 入棧
     */
    boolean push(T data);

    /*
     * 出棧
     */
    T pop();

    /*
     * 棧的長度
     */
    int length();

    /*
     * 棧是否爲空
     */
    boolean isEmpty();

    /*
     * 清空棧
     */
    void clear();
}

棧的順序表示

定義:

順序棧:即棧的順序存儲結構是利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素,同時附設指針(top)指示棧頂元素在順序棧中的位置。

代碼:

java程序代碼實現

public class MyArrayStack<T> implements IMyStack<T> {

    private Object[] objs = new Object[16];
    private int size;

    @Override
    public boolean push(T data) {
        if(size >= objs.length){
            addLength();
        }
        objs[size++]=data;
        return true;
    }

    @SuppressWarnings("unchecked")
    @Override
    public T pop() {
        if(size==0){
            return null;
        }
        return (T) objs[--size];
    }

    @Override
    public int length() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public void clear() {
        for (int i = 0; i < size; i++) {
            objs[i] = null;
        }
        size = 0;
    }

    @Override
    public String toString(){
        StringBuffer sb = new StringBuffer();
        sb.append("MyArrayStack:[");
        for (int i = 0; i < size; i++) {
            sb.append(objs[i]);
            if(i != size-1){
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

    /*
     * 擴容數組
     */
    private void addLength() {
        Object[] temp = new Object[size*3/2+1];
        for(int i=0; i<size; i++){
            temp[i] = objs[i];
            objs[i] = null;
        }
        objs = temp;
    }
}

棧的鏈式表示

定義:

鏈棧用鏈表作爲存儲結構,棧初始化時僅需給棧頂指針分配內存空間,而後每當有數據入棧時再爲該數據分配空間,這樣實現了內存空間的動態分配。

代碼:

java程序代碼實現

public class MyLinkedStack<T> implements IMyStack<T> {

    /*
     * 棧頂指針
     */
    private Node<T> top;
    /*
     * 棧的大小
     */
    private int size;

    public MyLinkedStack() {
        this.top = null;
        this.size = 0;
    }

    @Override
    public boolean push(T data) {
        Node<T> node = new Node<T>(data);
        node.next = top;
        // 修改棧頂指針
        top = node;
        size++;
        return true;
    }

    @Override
    public T pop() {
        if(top == null){
            return null;
        }
        Node<T> node = top;
        // 修改棧頂指針
        top=node.next;
        size--;
        return node.data;
    }

    @Override
    public int length() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public void clear() {
        top = null;
        size = 0;
    }

}

棧定義

棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。
對棧來說,表尾端有其特殊含義,稱爲棧頂(top),相應地表頭端稱爲棧底(bottom)。不含元素的空表稱爲空棧。

棧的修改是按後進先出的原則進行的,因此,棧又稱爲後進先出(Last in first out)的線性表(簡稱LIFO結構)。

棧的屬性與方法

Java程序代碼實現

public interface IMyStack<T> {

    /*
     * 入棧
     */
    boolean push(T data);

    /*
     * 出棧
     */
    T pop();

    /*
     * 棧的長度
     */
    int length();

    /*
     * 棧是否爲空
     */
    boolean isEmpty();

    /*
     * 清空棧
     */
    void clear();
}

棧的順序表示

定義:

順序棧:即棧的順序存儲結構是利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素,同時附設指針(top)指示棧頂元素在順序棧中的位置。

代碼:

java程序代碼實現

public class MyArrayStack<T> implements IMyStack<T> {

    private Object[] objs = new Object[16];
    private int size;

    @Override
    public boolean push(T data) {
        if(size >= objs.length){
            addLength();
        }
        objs[size++]=data;
        return true;
    }

    @SuppressWarnings("unchecked")
    @Override
    public T pop() {
        if(size==0){
            return null;
        }
        return (T) objs[--size];
    }

    @Override
    public int length() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public void clear() {
        for (int i = 0; i < size; i++) {
            objs[i] = null;
        }
        size = 0;
    }

    @Override
    public String toString(){
        StringBuffer sb = new StringBuffer();
        sb.append("MyArrayStack:[");
        for (int i = 0; i < size; i++) {
            sb.append(objs[i]);
            if(i != size-1){
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

    /*
     * 擴容數組
     */
    private void addLength() {
        Object[] temp = new Object[size*3/2+1];
        for(int i=0; i<size; i++){
            temp[i] = objs[i];
            objs[i] = null;
        }
        objs = temp;
    }
}

棧的鏈式表示

定義:

鏈棧用鏈表作爲存儲結構,棧初始化時僅需給棧頂指針分配內存空間,而後每當有數據入棧時再爲該數據分配空間,這樣實現了內存空間的動態分配。

代碼:

java程序代碼實現

public class MyLinkedStack<T> implements IMyStack<T> {

    /*
     * 棧頂指針
     */
    private Node<T> top;
    /*
     * 棧的大小
     */
    private int size;

    public MyLinkedStack() {
        this.top = null;
        this.size = 0;
    }

    @Override
    public boolean push(T data) {
        Node<T> node = new Node<T>(data);
        node.next = top;
        // 修改棧頂指針
        top = node;
        size++;
        return true;
    }

    @Override
    public T pop() {
        if(top == null){
            return null;
        }
        Node<T> node = top;
        // 修改棧頂指針
        top=node.next;
        size--;
        return node.data;
    }

    @Override
    public int length() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public void clear() {
        top = null;
        size = 0;
    }

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