1. 程式人生 > 其它 >12.java連結串列棧和陣列棧

12.java連結串列棧和陣列棧

棧是一個先入後出的有序列表,棧是限制線性表中元素的插入和刪除只能在線性表的同一端進行的一種特殊線性表,一端為變化的一端,稱為棧頂,另一端是固定的,稱為棧底。先入的元素在棧底,最後放入的元素在棧頂,刪除時後放入的元素先刪除,最先放入的元素最後刪除。

老師在這裡講解的只有用陣列模擬棧,書寫類ArrayStack,其中定義一個int型別的變數top來記錄棧頂索引,一個數組來記錄資料,一個int型別的變數maxSize來記錄棧的最大尺寸即可容納的資料個數。

程式碼如下:

class ArrayStack{
    public int top=-1;
    public int[] stack;
    
public int maxSize; public ArrayStack(int maxSize) { this.maxSize = maxSize; stack=new int[maxSize]; } public boolean isFull(){ if(top==maxSize-1) return true; return false; } public boolean isEmpty(){ if(top==-1) return true; return
false; } public void push(int value){ if(isFull()){ System.out.println("棧滿,無法加入"); return; } top++;//先加棧頂再賦值 stack[top]=value; } public int pop(){ if(isEmpty()){ throw new RuntimeException("棧空,沒有資料"); }
int value=stack[top]; top--; return value; } public void list(){ if(isEmpty()){ System.out.println("棧空,沒有資料"); } for(int i=top;i>=0;i--){ System.out.printf("stack[%d]=%d",i,stack[i]); } } }

老師留了課後作業,讓我們 用連結串列代替陣列來書寫棧,在很多次的修改和斟酌以後,我的最後設想如下:首先連結串列的節點中有三個變數,代表編號的no變數,代表具體資料的data變數和一個ArrayStack變數next來指向下一個節點。不再額外定義連結串列類來管理節點,直接定義連結串列棧類來管理節點,其中有兩個變數,代表最大可容納資料的maxSize,和一個頭節點代表連結串列。在原先變數top的改變上我最開始想另外定義一個節點為top來指向棧頂。但在試驗後發現並沒有這種必要,因為此處我使用的是頭插法,所以棧頂永遠都是head.next,不需另外定義。另外,在判斷棧空和棧滿時我發現十分麻煩,所以廢物利用了一下head節點中的data變數,將其含義變為目前連結串列長度,這樣在判斷時只需要判斷head.data是否為0或者maxSize即可。

java連結串列棧的類定義如下:

class linkstack{
    public int maxSize;

    public linkstack(int maxSize) {
        this.maxSize = maxSize;
    }

    public stackNodee head=new stackNodee(0,0);
    public boolean isFull(){
        if(head.data==maxSize){
            return true;
        }
        return false;
    }
    public boolean isempty(){
        if(head.data==0){
            return true;
        }
        return false;
    }
    public void push(int value){
        if(isFull()){
            System.out.println("棧已滿,無法加入");
            return;
        }
        int n=head.data+1;
        stackNodee temp=new stackNodee(n,value);
        if(isempty()){
            head.next=temp;
            head.data++;
            return;
        }
        temp.next=head.next;
        head.next=temp;
        head.data++;
    }
    public int pop(){
        int value;
        if(isempty()){
            throw new RuntimeException("棧空,沒有資料");
        }else {
            value=head.next.data;
            head.next=head.next.next;
            head.data--;
        }
        return value;
    }
    public void list(){
        if(isempty()){
            System.out.println("連結串列為空");
            return;
        }
        stackNodee temp=head.next;
        for (int i=1;i<=head.data;i++){
            System.out.printf("stack[%d]=%d\n",i,temp.data);
            temp=temp.next;
        }
    }

}
class stackNodee{
    public int no;
    public int data;
    public stackNodee next;

    public stackNodee(int no, int data) {
        this.no = no;
        this.data = data;
    }
}

這次的實驗讓我靈活運用了連結串列和棧,對此兩種資料結構都有了更進一步的理解。在書寫程式碼的過程中,我個人認為陣列的方式還是要比連結串列的方式簡單很多,有序陣列自帶記錄了索引和資料,以及可定義陣列長度,我認為還是比連結串列方便很多。