資料結構-線性表-棧的程式碼詳解
棧與佇列,是僅在表尾進行操作的線性表,均有順序結構和鏈式結構
先入先出為佇列,即 輸入 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(); } }