這次的實作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_;}
}



arrow
arrow
    全站熱搜

    雲淡風清 發表在 痞客邦 留言(0) 人氣()