使用JAVA數組實現順序棧

來源:互聯網
上載者:User

標籤:

1,首先總結一下線性表(分為順序表和連結資料表,【即順序儲存結構和鏈式儲存結構的區別】)和棧(順序棧和連結棧)還有隊列(順序隊列和連結隊列)的JAVA類庫中的實現:

java.util.ArrayList 實現了順序表,java.util.LinkedList 實現了連結資料表的功能。

java.util.ArrayDeque實現了順序棧和順序隊列(該類中即定義了與棧操作有關的方法,也定義了與隊列操作有關的方法)、java.util.LinkedList實現了連結棧和連結隊列。

2,定義了一個Stack<E>介面,指明該棧實現了哪些具體的操作。介面如下:

 1 public interface Stack<E> { 2     public int length();//返回棧的長度 3      4     public E pop();//出棧 5      6     public void push(E element);//進棧 7      8     public E peek();//訪問棧頂元素 9     10     public boolean empty();//判斷棧是否為空白11     12     public void clear();//清空棧13 }

3,在JAVA類庫中,java.util.ArrayDeque類實現了順序棧的功能。ArrayDeque可以實現動態地擴充棧的大小,但是不支援多線程訪問。同時,ArrayDeque還實現了順序隊列的功能。

4,定義了一個Object[] 類型的數組,用來儲存順序棧中的元素。具體實作類別SequenceStack.java 如下:

import java.util.Arrays;public class SequenceStack<E> implements Stack<E> {        private int DEFAULT_SIZE = 16;//定義棧的初始預設長度    private int capacity;//儲存順序棧的長度    private int size;//儲存順序棧中元素的個數    private Object[] elementData;//定義一個數組用於儲存順序棧中的元素        public SequenceStack() {        capacity = DEFAULT_SIZE;        elementData = new Object[capacity];    }        //以指定的大小來建立棧    public SequenceStack(int initSize){        capacity = 1;        while(capacity < initSize)            capacity <<= 1;//將capacity設定成大於initSize的最小2次方        elementData = new Object[capacity];    }    //返回當前順序棧中元素的個數    public int length() {        return size;    }    public E pop() {        if(empty())            throw new IndexOutOfBoundsException("棧空,不能出棧");        E oldValue = (E)elementData[size - 1];        elementData[--size] = null;//讓記憶體回收行程及時回收,避免記憶體泄露        return oldValue;    }    public void push(E element) {        ensureCapacity(size + 1);        elementData[size++] = element;    }        private void ensureCapacity(int minCapacity){        if(minCapacity > capacity){            while(capacity < minCapacity)                capacity <<= 1;        elementData = Arrays.copyOf(elementData, capacity);        }    }    //擷取棧頂元素,不會將棧頂元素刪除    public E peek() {        if(size == 0)            throw new ArrayIndexOutOfBoundsException("棧為空白");        return (E)elementData[size - 1];    }    public boolean empty() {        return size == 0;    }    public void clear() {//        Arrays.fill(elementData, null);        for(int i = 0; i < size; i++)            elementData[i] = null;        size = 0;    }    public String toString(){        if(size == 0)            return "[]";        else{            StringBuilder sb = new StringBuilder("[");            for(int i = size - 1; i >= 0; i--)                sb.append(elementData[i].toString() + ", ");            int len = sb.length();            //刪除由於上面for迴圈中最後添加的多餘的兩個字元 (一個是逗號,一個是空格符號)            return sb.delete(len - 2, len).append("]").toString();        }    }}

 

使用JAVA數組實現順序棧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.