成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)(DataStructure)2

simpleapples / 815人閱讀

摘要:堆棧可以看成是有特定規(guī)則為的線性表,特定規(guī)則就是先進(jìn)后出,后進(jìn)先出,可以看成是我們的先的要后,所以利用這一點(diǎn)可以通過繼承或組合的方式來構(gòu)建堆棧。鑒于上面這張物理結(jié)構(gòu)和邏輯結(jié)構(gòu),我們采用提供的來構(gòu)建主存儲(chǔ)結(jié)構(gòu),即節(jié)點(diǎn)的線性表以達(dá)到索引的目的。

堆棧

可以看成是有特定規(guī)則為的線性表,特定規(guī)則就是先進(jìn)后出,后進(jìn)先出,可以看成是我們List的先insertFromHead的要后deleteFromHead,所以利用這一點(diǎn)可以通過繼承或組合的方式來構(gòu)建堆棧。

繼承構(gòu)建堆棧:

public class StackInheritance extends List {
   public StackInheritance() { super( "stack" ); }
   public void push( Object o )
      { insertFromHead( o ); }
   public Object pop() throws EmptyListException
      { return deleteFromHead(); }
   public boolean isEmpty() { return super.isEmpty(); }
   public void print() { super.print(); }
}

組合構(gòu)建堆棧:

public class StackComposition {
   private List s;

   public StackComposition() { s = new List( "stack" ); }
   public void push( Object o )
      { s.insertFromHead( o ); }
   public Object pop() throws EmptyListException
      { return s.deleteFromHead(); }
   public boolean isEmpty() { return s.isEmpty(); }
   public void print() { s.print(); }
}

隊(duì)列

可以看成是有特定規(guī)則為的線性表,特定規(guī)則就是先進(jìn)先出(FIFO),后進(jìn)后出,可以看成是我們List的先insertFromBack的要后deleteFromHead,所以利用這一點(diǎn)可以通過繼承或組合的方式來構(gòu)建堆棧。

繼承構(gòu)建隊(duì)列

public class QueueInheritance extends List {
   public QueueInheritance() { super( "queue" ); }
   public void enqueue( Object o )
      { insertFromBack( o ); }
   public Object dequeue()
      throws EmptyListException { returnDeleteFromHead(); }
   public boolean isEmpty() { return super.isEmpty(); }
   public void print() { super.print(); }
}

二叉樹

可以看成是一堆散節(jié)點(diǎn)通過特殊的連接構(gòu)成的散點(diǎn)集,這些散點(diǎn)集構(gòu)成了特殊的結(jié)構(gòu),看起來成了樹一樣的結(jié)果。

如下圖所示,上面的為二叉樹的邏輯結(jié)構(gòu),這樣的邏輯結(jié)構(gòu)利于分析二叉樹的性質(zhì),卻不能說明二叉樹存儲(chǔ)的實(shí)際情形,因此需要使用下圖所示的二叉樹的物理結(jié)構(gòu)來描述其存儲(chǔ)特性,二叉樹的節(jié)點(diǎn)存儲(chǔ)為線性表,線性表中的節(jié)點(diǎn)有自己的特殊的包含(連接關(guān)系),因此使得這種物理結(jié)構(gòu)和它的邏輯結(jié)構(gòu)有了能夠轉(zhuǎn)換的基礎(chǔ)。

鑒于上面這張物理結(jié)構(gòu)和邏輯結(jié)構(gòu),我們采用Java提供的List(LinkedList)來構(gòu)建主存儲(chǔ)結(jié)構(gòu),即Node節(jié)點(diǎn)的線性表以達(dá)到索引的目的。然后建立節(jié)點(diǎn)之間的連接關(guān)系。

import java.util.LinkedList;
import java.util.List;

public class BinTreeTraverse {

    private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    private static List nodeList = null;

    /**
     * 內(nèi)部類:節(jié)點(diǎn)
     */
    private static class Node {
        Node leftChild;
        Node rightChild;
        int data;

        Node(int newData) {
            leftChild = null;
            rightChild = null;
            data = newData;
        }
    }

    public void createBinTree() {
        nodeList = new LinkedList();
        // 將一個(gè)數(shù)組的值依次轉(zhuǎn)換為Node節(jié)點(diǎn)
        for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
            nodeList.add(new Node(array[nodeIndex]));
        }
        // 對(duì)前l(fā)astParentIndex-1個(gè)父節(jié)點(diǎn)按照父節(jié)點(diǎn)與孩子節(jié)點(diǎn)的數(shù)字關(guān)系建立二叉樹
        for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
            // 左孩子
            nodeList.get(parentIndex).leftChild = nodeList
                    .get(parentIndex * 2 + 1);
            // 右孩子
            nodeList.get(parentIndex).rightChild = nodeList
                    .get(parentIndex * 2 + 2);
        }
        // 最后一個(gè)父節(jié)點(diǎn):因?yàn)樽詈笠粋€(gè)父節(jié)點(diǎn)可能沒有右孩子,所以多帶帶拿出來處理
        int lastParentIndex = array.length / 2 - 1;
        // 左孩子
        nodeList.get(lastParentIndex).leftChild = nodeList
                .get(lastParentIndex * 2 + 1);
        // 右孩子,如果數(shù)組的長(zhǎng)度為奇數(shù)才建立右孩子
        if (array.length % 2 == 1) {
            nodeList.get(lastParentIndex).rightChild = nodeList
                    .get(lastParentIndex * 2 + 2);
        }
    }

    /**
     * 先序遍歷
     * 
     * 這三種不同的遍歷結(jié)構(gòu)都是一樣的,只是先后順序不一樣而已
     * 
     * @param node
     *            遍歷的節(jié)點(diǎn)
     */
    public static void preOrderTraverse(Node node) {
        if (node == null)
            return;
        System.out.print(node.data + " ");
        preOrderTraverse(node.leftChild);
        preOrderTraverse(node.rightChild);
    }

    /**
     * 中序遍歷
     * 
     * 這三種不同的遍歷結(jié)構(gòu)都是一樣的,只是先后順序不一樣而已
     * 
     * @param node
     *            遍歷的節(jié)點(diǎn)
     */
    public static void inOrderTraverse(Node node) {
        if (node == null)
            return;
        inOrderTraverse(node.leftChild);
        System.out.print(node.data + " ");
        inOrderTraverse(node.rightChild);
    }

    /**
     * 后序遍歷
     * 
     * 這三種不同的遍歷結(jié)構(gòu)都是一樣的,只是先后順序不一樣而已
     * 
     * @param node
     *            遍歷的節(jié)點(diǎn)
     */
    public static void postOrderTraverse(Node node) {
        if (node == null)
            return;
        postOrderTraverse(node.leftChild);
        postOrderTraverse(node.rightChild);
        System.out.print(node.data + " ");
    }

    public static void main(String[] args) {
        BinTreeTraverse binTree = new BinTreeTraverse();
        binTree.createBinTree();
        // nodeList中第0個(gè)索引處的值即為根節(jié)點(diǎn)
        Node root = nodeList.get(0);

        System.out.println("先序遍歷:");
        preOrderTraverse(root);
        System.out.println();

        System.out.println("中序遍歷:");
        inOrderTraverse(root);
        System.out.println();

        System.out.println("后序遍歷:");
        postOrderTraverse(root);
    }

}
  

這里我們?yōu)槭裁床皇褂米约憾x的NodeList呢?因?yàn)槿绻坏┦褂眠@個(gè)NodeList來作為主存儲(chǔ)部分,就會(huì)使得在子節(jié)點(diǎn)的指向過程中導(dǎo)致整個(gè)結(jié)構(gòu)指向混亂,造成對(duì)結(jié)構(gòu)的破壞。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64205.html

相關(guān)文章

  • Java? 教程(嵌套類)

    嵌套類 Java編程語言允許你在另一個(gè)類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術(shù)語:嵌套類分為兩類:靜態(tài)和非靜態(tài),聲明為static的嵌套類稱為靜態(tài)嵌套類,非靜態(tài)嵌套類稱為內(nèi)部類。 class OuterClass { ... stati...

    Cheng_Gang 評(píng)論0 收藏0
  • Java 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)DataStructure)1

    摘要:雙向鏈表的實(shí)現(xiàn),必須注意雙向鏈表的和兩個(gè)指針的正確指向,以及插入和刪除過程中指向操作增減的有序性。定義節(jié)點(diǎn),節(jié)點(diǎn)數(shù)據(jù)類型為,可以通過多態(tài)方式具象化為其他類型定義從頭尾節(jié)點(diǎn)增加節(jié)點(diǎn)定義從頭尾節(jié)點(diǎn)刪除節(jié)點(diǎn) 線性表和鏈表 單向鏈表利用了類的自引用,實(shí)現(xiàn)了類似指針的效果。 雙向鏈表的實(shí)現(xiàn),必須注意雙向鏈表的head和back兩個(gè)指針的正確指向,以及插入和刪除過程中指向操作增減的有序性。 下...

    宋華 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)-棧

    摘要:棧也稱為后進(jìn)先出表?xiàng)5膽?yīng)用場(chǎng)景操作撤銷例如將操作的每組數(shù)據(jù)存入棧中,如果想要撤銷,只需要彈出棧頂元素,就可以恢復(fù)上一步操作了。最后執(zhí)行完成,根據(jù)棧的結(jié)構(gòu)開始彈出數(shù)據(jù),一步一步再走回方法。 數(shù)據(jù)結(jié)構(gòu)-棧 定義 棧(英語:stack)又稱為堆?;蚨询B,棧作為一種數(shù)據(jù)結(jié)構(gòu),它按照先進(jìn)后出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)(最后一個(gè)數(shù)據(jù)...

    TalkingData 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)-數(shù)組

    摘要:數(shù)據(jù)結(jié)構(gòu)數(shù)組數(shù)組數(shù)據(jù)結(jié)構(gòu)中最基本的一個(gè)結(jié)構(gòu)就是線性結(jié)構(gòu),而線性結(jié)構(gòu)又分為連續(xù)存儲(chǔ)結(jié)構(gòu)和離散存儲(chǔ)結(jié)構(gòu)。比如容量,擴(kuò)容個(gè),沒有意義,很快就滿了容量,擴(kuò)充個(gè),太多了,容易早證浪費(fèi)。 數(shù)據(jù)結(jié)構(gòu)-數(shù)組 數(shù)組 數(shù)據(jù)結(jié)構(gòu)中最基本的一個(gè)結(jié)構(gòu)就是線性結(jié)構(gòu),而線性結(jié)構(gòu)又分為連續(xù)存儲(chǔ)結(jié)構(gòu)和離散存儲(chǔ)結(jié)構(gòu)。所謂的連續(xù)存儲(chǔ)結(jié)構(gòu)其實(shí)就是數(shù)組。 優(yōu)點(diǎn):插入塊如果知道坐標(biāo)可以快速去地存取 缺點(diǎn):查找慢,刪除慢,大...

    894974231 評(píng)論0 收藏0
  • HashedWheelTimer算法詳解

    摘要:算法序和年的論文提出了一種定時(shí)輪的方式來管理和維護(hù)大量的調(diào)度算法內(nèi)核中的定時(shí)器采用的就是這個(gè)方案。使用實(shí)例每一次的時(shí)間間隔每一次就會(huì)到達(dá)下一個(gè)槽位輪中的數(shù)源碼解讀之時(shí)間輪算法實(shí)現(xiàn)定時(shí)輪算法細(xì)說延時(shí)任務(wù)的處理定時(shí)器的實(shí)現(xiàn) HashedWheelTimer算法 序 George Varghese 和 Tony Lauck 1996 年的論文:Hashed and Hierarchical ...

    aervon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<