這次的實作stack 堆疊
如同字面上的意思 一堆資料疊在一起
像盤子一樣((好老套的說法
要拿 從最上面的開始拿
要存 會一直往上累積
先進後出
先進的 被壓在下面
後進的 會被先拿走
說穿了 會改變的只有最上面的那個點
存入是存在最上面 取出也是從最上面開始拿
所以
newNode.link = front; front = newNode;
新的節點的連結就連到原先的串列
再讓front 為新的節點
這樣就能維持一直插入在頂端了
取出也是同樣的道理
front = front.link;
直接讓front往後跳一個點,當然在跳之前要先把他的data先存下來
然後在跳後面一個點,return data
這樣就大功告成了
stack其實是滿簡單的單向鏈結串列呢
至於peep
這個緣由滿好笑的,會寫這個方法是因為在寫單向鏈結串列的四則運算優先問題時
想看stack最上面的資料,卻又不希望他提出來
要開始編寫時想不到方法名稱要叫什麼,就google翻譯了一下
想說 偷偷看一下 就打偷看 竟然跳出 peep
馬上勾起c#的回憶,c#的stack中 也有peep
當初沒想太多,現在回想起來了
原來阿 c#的程式設計人員跟我有一樣的想法呢
偷看一下 peep 滿好玩的
peep 就很簡單 直接return front的data就好了
以下是java程式碼
import java.util.Scanner; class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Stack stack = new Stack(); System.out.print("請輸入指令 1.插入 2.刪除 3.查詢頂端資料 4.查詢長度 : "); while(input.hasNext()) { switch(input.nextInt()) { case 1 : System.out.print("請輸入要插入的數字 : "); stack.push(input.nextInt()); System.out.println(); break; case 2 : if(stack.isNull())System.out.println("無元素"); else System.out.println("得到 : "+stack.pop()); break; case 3 : System.out.println("頂端的資料為 : "+stack.peep()); break; case 4 : System.out.println("長度為 : "+stack.count()); break; } System.out.print("請輸入指令 1.插入 2.刪除 3.查詢頂端資料 4.查詢長度 : "); } } } class Node { public int data; public Node link; Node(int data){this.data = data;} } class Stack { int count_ = 0; Node front; public void push(int data)//插入 { count_++; Node newNode = new Node(data); if(front == null) { front = newNode; return; } newNode.link = front; front = newNode; print(); } public int peep()//偷看!? { return front.data; } public int pop()//刪除 { count_--; int data = front.data; front = front.link; print(); return data; } public boolean isNull()//判斷是否為空 { return front == null ? true :false; } public void print() { Node printTemp =front; while(printTemp != null) { System.out.print(printTemp.data); printTemp = printTemp.link; if(printTemp != null)System.out.print(" ---> "); else System.out.println(); } } public int count(){return count_;} }
全站熱搜
留言列表