1. 程式人生 > >資料結構-線性表-棧的程式碼詳解

資料結構-線性表-棧的程式碼詳解

棧與佇列,是僅在表尾進行操作的線性表,均有順序結構和鏈式結構

先入先出為佇列,即 輸入 1 2 3 4 5,打印出 1 2 3 4 5

先入後出為棧,即 輸入 1 2 3 4 5,打印出 5 4 3 2 1

這裡詳解棧的順序結構和鏈式結構,程式碼最後附上!!!!!

一。順序棧

                          程式碼結構  兩包 一介面,五類  

 順序棧所在Stack包

1.Stack.java 棧介面類,下面的鏈棧也用到此介面

                

2.順序棧物件   Mystack.java

              

              

              

              

3.測試類  Test.java

4.執行結果

                 

二。鏈棧。所用到以上的stack介面!!!!!一定記得用到了stack介面

     1.Stack.java 在上面,有的方法不需要例項化使用

     2.Node.java節點類

         

   3.LinkedStack.java   鏈棧物件類

       

       

        

         

3.Test.java 測試類

4.執行結果

      

程式碼附上!!

第一部分:

Stack.java

package Stack;

//定義棧模板 public interface Stack<E> { //判斷是否為空棧     public boolean Isempty() ;     //判斷棧是否滿了      public boolean Isfull();          //入棧     public void push(E e);     //出棧     public void pop();          //棧的長度     public int Length();          //列印棧中所有元素     public void FindALL();     //列印棧頂元素     public void FindOne();      }  

Mystack.java

package Stack;

//定義一個順序結構的棧 實現Stack介面 public class MyStack<E> implements Stack<E> {          //定義棧的最大容量,若有興趣你可以嘗試增加一個方法,使其滿棧時增加容量     public int Maxsize =10;     //定義資料域,即儲存資料的地方     public Object[] obj = null;     //定義棧頂指標,因為順序結構從零開始計數,所以定義指標為-1,因為指標若為0,表示第一個資料已經儲存在裡面了     public int top = -1;      //建構函式分為兩塊,一塊是使用者不想自己設定最大容量,一塊是使用者自己輸入最大容量     MyStack(){         this.obj = new Object[Maxsize];     }          public MyStack(int Maxsize) {         this.Maxsize = Maxsize;         this.obj = new Object[Maxsize];         // TODO Auto-generated constructor stub     }     @Override     public boolean Isempty() {         // TODO Auto-generated method stub         if(top < 0) return true;         else  return false;     }

    @Override     public boolean Isfull() {         // TODO Auto-generated method stub     if(top < Maxsize)    return false;     else  return true;          }

    @Override     public void push(E e) {         // TODO Auto-generated method stub             if(Isfull()) {             try {                 throw new Exception("滿棧無法進行入棧操作");             } catch (Exception e1) {                 // TODO Auto-generated catch block                 e1.printStackTrace();             }         }         //棧頂上移,增加新資料         top++;         obj[top]=e;             }

    @Override     public void pop() {         // TODO Auto-generated method stub         if(Isempty()) {             try {                 throw new Exception("空棧無法進行操作");             } catch (Exception e1) {                 // TODO Auto-generated catch block                 e1.printStackTrace();             }         }         //列印此時棧頂的元素         System.out.println("此次出棧元素為"+obj[top]);         //直接更新棧頂         top--;              }

    @Override     public int Length() {         // TODO Auto-generated method stub         return this.top+1;     }

    @Override     public void FindALL() {         // TODO Auto-generated method stub         //因為棧是先進後出,所以在列印陣列時進行倒序列印即可         System.out.println("棧中儲存的資料是");         for(int j=top;j>=0;j--) {             System.out.print(obj[j]+" ");         }              }

    @Override     public void FindOne() {         // TODO Auto-generated method stub             if(Isempty()) {             try {                 throw new Exception("空棧無法進行操作");             } catch (Exception e1) {                 // TODO Auto-generated catch block                 e1.printStackTrace();             }         }         System.out.println("此時棧頂元素為"+ obj[top]);     }

}  

Test.java

package Stack;

public class Test {     public static void main(String[] args) {         //例項化一個棧         MyStack<String> myStack = new MyStack<String>();         //入棧五條資料         myStack.push("一");         myStack.push("棵");         myStack.push("大");         myStack.push("白");         myStack.push("菜");                  //列印棧中資料與棧頂資料         myStack.FindALL();         myStack.FindOne();                  //首位元素出棧,再次列印棧中資料與棧頂資料         myStack.pop();         myStack.FindALL();         myStack.FindOne();         }  }  

第二部分!!

Node.java

package StackLink; /*  * 定義節點類,後續合成連結串列或者對連結串列進行操作  * */ public class Node<E> { //節點儲存的變數     public Object data;     //指向下一個節點     public Node next = null;     public Node(E data) {         this.data = data;     } }  

LinkedStack.java

package StackLink;

import Stack.Stack;

//切記鏈式儲存下的棧不考慮滿不滿,畢竟他滿不滿是由電腦實體記憶體決定的,而不是認為定義的, //而這裡我比較懶,直接繼承了上一個順序儲存棧中的stack模型,所以我對Isfull方法不進行例項化 public class LinkedStack<E> implements Stack<E> {     //定義棧頂,目前是空棧,所以定義出來的節點為null     Node<E> top = null;     //監聽節點數量     int i=0;              @Override     public boolean Isempty() {         // TODO Auto-generated method stub         if(top!=null) return false;         else return true;     }     @Override     public boolean Isfull() {         // TODO Auto-generated method stub         return false;     }     @Override     public void push(E e) {         // TODO Auto-generated method stub         Node<E> newNode = new Node<E>(e);         //每次新輸入的節點都會成為top,而舊節點則被top的next指向         if(Isempty()) {             top = newNode;         }         else {         Node<E> temp = top;         top = newNode;         top.next = temp;         }         i++;     }     @Override     public void pop() {         // TODO Auto-generated method stub         if(Isempty()) {             try {                 throw new Exception("空棧,不能進行出棧操作!!!");             } catch (Exception e) {                 // TODO Auto-generated catch block                 e.printStackTrace();             }         }         //讓棧頂處節點直接變為null,就變相的把節點前一元素的next指向了null,也就把該節點出棧了         top = top.next;             i--;     }     @Override     public int Length() {         // TODO Auto-generated method stub         return i;     }     @Override     public void FindALL() {         // TODO Auto-generated method stub         if(Isempty()) {             try {                 throw new Exception("空棧無法進行操作");             } catch (Exception e1) {                 // TODO Auto-generated catch block                 e1.printStackTrace();             }         }         Node<E> mdNode = top;         while(mdNode!=null){             System.out.print(mdNode.data+" ");             mdNode = mdNode.next;         }          }     @Override     public void FindOne() {         // TODO Auto-generated method stub         if(Isempty()) {             try {                 throw new Exception("空棧無法進行操作");             } catch (Exception e1) {                 // TODO Auto-generated catch block                 e1.printStackTrace();             }         }         System.out.println("棧頂資料為"+top.data);         }      }  

Test.java

package StackLink;

public class Test {     public static void main(String[] args) {         //例項化一個棧         LinkedStack<String> myStack = new LinkedStack<String>();         //入棧五條資料         myStack.push("一");         myStack.push("棵");         myStack.push("大");         myStack.push("白");         myStack.push("菜");                  //列印棧中資料與棧頂資料         myStack.FindOne();         myStack.FindALL();                  //刪除棧頂         myStack.pop();         System.out.println();                  //列印棧中資料與棧頂資料                 myStack.FindOne();                 myStack.FindALL();          }  }