數據結構-----3.棧:

1.特點:遵循 “先進後出”的規則,棧主要包含兩個操作,“入棧” 和 “出棧”,棧這種數據結構有兩種實現方式:1.數組實現,2.鏈表實現。例如:瀏覽器的前進和後退功能就可以使用兩個棧來實現,程序中函數的調用也是通過棧來實現。

基於數組實現的叫做“順序棧”,基於鏈表實現的叫做“鏈式棧”。

空間複雜度的概念:除了必須存儲數據的空間外,還需要在程序運行時,需要額外的空間。在棧的入棧和出棧過程中,所需要的空間複雜度爲O(1)。

/*
* 使用數組來實現一個空間大小固定的棧*/
public class ArrayStack<E> {
    /*定義一個數組*/
    private Object[] elementData;

    /*該棧空間的大小*/
    private int size;

    /*當前棧中存儲元素的個數*/
    private int count;

    public ArrayStack(int size) {
        this.elementData = new Object[size];
        this.size = size;
        this.count = 0;
    }

    /*
    * 入棧操作*/
    public boolean push(Object element) {
        /*棧中的數組空間如果不夠了,那麼直接返回false.
        * 因爲count是從0開始的,size是從1開始的,所以當count == size時,不能再向棧中插入數據*/
        if(count == size) return false;
        /*如果數組可以存放數據,那麼放在count的位置*/
        elementData[count] = element;
        count++;
        return true;
    }

    /*
    * 出棧操作*/
    public E pop() {
        /*首先判斷棧中元素的個數是否爲空*/
        if(count == 0) return null;
        E element = (E)elementData[count-1];
        count--;
        return element;
    }

    public static void main(String[] args) {
        //泛型針對的是”引用“而言,對於後面在堆中存儲的對象,不起約束作用
        ArrayStack stack = new ArrayStack<String>(5);
        for(int i=0;i<=5;i++) {
            System.out.println(stack.push(i)+"  ,"+i);
        }
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}
/**
 *使用鏈表實現一個鏈式棧
 */
public class LinkedListStack<T> {

    /*定義一個棧頂指針*/
    private StackNode top = null;

    /*入棧操作*/
    public void push(Object value) {
        StackNode newNode = new StackNode(value,null);
        if(top == null) {
            top = newNode;
        }else {
            /*首先設定新節點的後繼節點爲top,然後移動top指針,將top指向新節點*/
            newNode.setNext(top);
            top = newNode;
        }
    }

    /*出棧操作*/
    public T pop() {
        if(top == null) return null;
         /*將value類型強轉爲泛型類型*/
         T value = (T)top.getValue();
        top = top.getNext();
        return value;
    }

    /*打印棧中的所有元素*/
    public void printAllElements() {
        if(top == null) return;
        while (top != null) {
            System.out.println(top.getValue());
            top = top.getNext();
        }
    }

    private class StackNode<T> {
        /*節點值*/
        private T value;
        /*指向的下一個節點*/
        private StackNode next;

        public StackNode(T value,StackNode next) {
            this.value = value;
            this.next = next;
        }

        public T getValue() {
            return value;
        }

        public void setValue(T value) {
            this.value = value;
        }

        public StackNode getNext() {
            return next;
        }

        public void setNext(StackNode next) {
            this.next = next;
        }
    }

    public static void main(String[] args) {
        LinkedListStack<Integer> stack = new LinkedListStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.pop();
        stack.printAllElements();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章