廣義表

廣義表
廣義表的定義
廣義表的存儲(chǔ)結(jié)構(gòu)
廣義表的M元多項(xiàng)式
廣義表的遞歸算法

一立轧、廣義表的定義:
廣義表(Lists尚揣,又稱列表)是一種非線性的數(shù)據(jù)結(jié)構(gòu)翠拣,是線性表的一種推廣闸英。
廣義表一般記作 LS = (d1,d2,....,dn);
其中LS是廣義表的名稱,n是它的長(zhǎng)度;

單元素(數(shù)據(jù)元素)和子表(廣義表)
表頭(第一個(gè)元素d1)、表尾(剩余元素組成的表)

二钝凶、廣義表的存儲(chǔ)結(jié)構(gòu):
首先我們看一下順序存儲(chǔ)結(jié)構(gòu)仪芒,如:?jiǎn)卧亍⒆颖砀荨卧氐嗝⒆颖怼⒆颖怼?br> 可以看出這樣存儲(chǔ)很復(fù)雜哟沫,你不知道要分配多少存儲(chǔ)空間給一個(gè)元素饺蔑。


廣義表順序存儲(chǔ)結(jié)構(gòu)舉例.png

鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):
每個(gè)數(shù)據(jù)元素用一個(gè)結(jié)點(diǎn)表示。(兩種類型的結(jié)點(diǎn):表結(jié)點(diǎn)和元素結(jié)點(diǎn))


廣義表的兩種結(jié)點(diǎn).png

(頭尾鏈表存儲(chǔ)表示)
可以看到嗜诀,結(jié)點(diǎn)內(nèi)容包含這些信息
表結(jié)點(diǎn):標(biāo)志域猾警、指示表頭的指針域、指示表尾的指針域
元素結(jié)點(diǎn):標(biāo)志域隆敢、值域

這種結(jié)構(gòu)的三個(gè)好處:
指針域的作用是用來判斷列表是否為空
容易分清列表中單元素和子表所在層次--发皿?如下圖中:BC在同一層,BC的內(nèi)容在同一層拂蝎。
最高層的表結(jié)點(diǎn)個(gè)數(shù)即為列表的長(zhǎng)度--穴墅?比如說D的長(zhǎng)度為3,表示元素A,B,C公3個(gè)温自。


廣義表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu).jpg

其中D為共享表封救,E為遞歸表。

(擴(kuò)展線性鏈表存儲(chǔ)表示)
另一種結(jié)點(diǎn)結(jié)構(gòu)的鏈表表示列表
表結(jié)點(diǎn)和原子結(jié)點(diǎn)均由三個(gè)域組成:標(biāo)志域捣作、指示表頭的指針域和指示表尾的指針域;原子結(jié)點(diǎn)的三個(gè)域?yàn)椋簶?biāo)志域鹅士、值域和指示表尾的指針域券躁。

一元多項(xiàng)式--線性表
一元多項(xiàng)式可以很容易的表示為線性表如:2X^8-9X5+5*X2+8,構(gòu)成的線性表為{{2,8}, {-9,5}, {5,2}, {8,0}}

M元多項(xiàng)式---廣義表 關(guān)聯(lián)掉盅?


廣義表與M元多項(xiàng)式.png

廣義表的遞歸算法(對(duì)于非遞歸表且無(wú)共享子表的廣義表)(遞歸:基本項(xiàng) 和 歸納項(xiàng))
可實(shí)現(xiàn)廣義表的三種操作:
1也拜、求廣義表的深度 即表中括弧的重?cái)?shù)。
將廣義表分解成n個(gè)子表趾痘,分別(遞歸)求得每個(gè)子表的深度慢哈。(遞歸的終止條件是空表和單元素)

3種情況的廣義表的深度分別為:
空表的深度=1;
原子的深度=0永票;
廣義表的深度= Max{子表的深度}+1卵贱;
具體實(shí)現(xiàn):

2滥沫、復(fù)制廣義表
3種情況的廣義表復(fù)制:
空表直接復(fù)制;
原結(jié)點(diǎn)直接復(fù)制得到键俱;
復(fù)制表頭+表尾 (使用遞歸)
具體實(shí)現(xiàn):

3兰绣、建立廣義表的存儲(chǔ)結(jié)構(gòu)
3種情況:
空表的情況;
單字符建立的子表(一個(gè)原子結(jié)點(diǎn))的情況编振;
由最簡(jiǎn)單的子表組合成廣義表:廣義表與子表的關(guān)系缀辩,相鄰兩個(gè)子表的關(guān)系。


//廣義表,包括廣義表的建立,求深度,復(fù)制; 采用的是將廣義表劃分為"頭"和"尾"的模式踪央。
//這些操作以"(((a,b),(c,d)),(e,(f,g),h),z)"形式的字符串為基礎(chǔ).一對(duì)括號(hào)代表一個(gè)表.
public class GLists {
    //節(jié)點(diǎn)類型
    public static int ATOM = 0;
    public static int LIST = 1;


    public int tag;//用于區(qū)分節(jié)點(diǎn)

    public Object atom;//原子類型
    public GLists hp, tp;//指向表頭和表尾


    //建立廣義表"(((a,b),(c,d)),(e,(f,g),h),z)"這樣形式的字符串為內(nèi)通建立廣義表
    //同樣采用遞歸方式臀玄。結(jié)束條件是空表和原子。
    //遞歸建立表頭和表尾
    public static GLists createGList(GLists L, String s) {
        System.out.println(s);
        GLists p = null;
        GLists q = null;

        if (s.equals("()")) {
            L = null;//如果是空表
        }
        else {
            L = new GLists();
            if (s.length() == 1) {
                L.tag = ATOM;
                L.atom = s.charAt(0);
            }//創(chuàng)建單原子廣義表
            else {
                L.tag = LIST;
                p = L;
                String sub = s.substring(1, s.length() - 1);

                do {//小尾中脫出頭畅蹂,循環(huán)建立同一層次的結(jié)點(diǎn)
                    Temp temp = new Temp(sub);
                    String hsub = sever(temp);
                    sub = temp.string;

                    p.hp = createGList(p.hp, hsub);
                    q = p;//hsub是頭建立頭

                    if (!sub.isEmpty()) {//如果有尾
                        p = new GLists();
                        p.tag = LIST;
                        q.tp = p;
                    }
                } while (!sub.isEmpty());
                q.tp = null;
            }
        }

        return L;
    }


    //該函數(shù)處理(((a,b),(c,d)),(e,(f,g),h),z)后健无,hstr = ((a,b),(c,d)) str = (e,(f,g),h),z.
//等于把表頭和表尾分開
    public static String sever(Temp t) {
        String str = t.string;
        int n = str.length();
        int i = 0;
        int k = 0;
        char ch;
        String hstr = null;

        do {
            ch = str.charAt(i);
            i++;

            if (ch == '(') {
                k++;
            } else if (ch == ')') {
                k--;
            }
        } while (i < n && (ch != ',' || k != 0));

        if (i < n) {
            hstr = str.substring(0, i - 1);
            str = str.substring(i);
        } else {
            hstr = str;
            str = "";
        }

        t.string = str;
        return hstr;
    }

    //求廣義表的深度
    public static int GetDeepth(GLists L) {
        if (L == null) {
            return 1;//空表
        }
        if (L.tag == ATOM) {
            return 0;//原子
        }
        int max = 0;
        GLists p = L;
        for (; p != null; p = p.tp) {//求同一層的光儀表元素的最大深度
            int tem = GetDeepth(p.hp);
            if (tem > max) {
                max = tem;
            }
        }

        return max + 1;
    }

    //復(fù)制廣義表
    public static GLists Copy(GLists M, GLists L) {//復(fù)制廣義表,把L復(fù)制到M
        if (L == null) {
            M = null;//空表
        } else {
            M = new GLists();
            M.tag = L.tag;
            if (M.tag == ATOM) {
                M.atom = L.atom;
            } else {
                M.hp = Copy(M.hp, L.hp);//復(fù)制頭
                M.tp = Copy(M.tp, L.tp);//復(fù)制尾
            }
        }
        return M;
    }

    public static void main(String[] args) {
        GLists L = null;
        String s = "(((a,b),(c,d)),(e,(f,g),h),z)";

        //建表
        L = GLists.createGList(L, s);
        //求表深度
        int len = GLists.GetDeepth(L);
        System.out.println(len);
        //表復(fù)制
        GLists M = null;
        M = GLists.Copy(M, L);
    }
}

//為了應(yīng)對(duì)值傳遞,只能傳遞引用拷貝魁莉,無(wú)法傳遞“地址”的問題
class Temp {
    String string = "";

    public Temp(String s) {
        string = s;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睬涧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旗唁,更是在濱河造成了極大的恐慌畦浓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件检疫,死亡現(xiàn)場(chǎng)離奇詭異讶请,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屎媳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門夺溢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烛谊,你說我怎么就攤上這事风响。” “怎么了丹禀?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵状勤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我双泪,道長(zhǎng)持搜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任焙矛,我火速辦了婚禮葫盼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘村斟。我一直安慰自己贫导,他們只是感情好抛猫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脱盲,像睡著了一般邑滨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钱反,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天掖看,我揣著相機(jī)與錄音,去河邊找鬼面哥。 笑死哎壳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尚卫。 我是一名探鬼主播归榕,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吱涉!你這毒婦竟也來了刹泄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怎爵,失蹤者是張志新(化名)和其女友劉穎特石,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖链,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姆蘸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芙委。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞敷。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灌侣,靈堂內(nèi)的尸體忽然破棺而出推捐,到底是詐尸還是另有隱情,我是刑警寧澤侧啼,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布玖姑,位于F島的核電站,受9級(jí)特大地震影響慨菱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戴甩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一符喝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甜孤,春花似錦协饲、人聲如沸畏腕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)描馅。三九已至,卻和暖如春而线,著一層夾襖步出監(jiān)牢的瞬間铭污,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工膀篮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘹狞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓誓竿,卻偏偏與公主長(zhǎng)得像磅网,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筷屡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 廣義表(Lists涧偷,又稱列表)是線性表的推廣。線性表定義為n>=0個(gè)元素a1,a2,a3,…,an的有限序列毙死。線性...
    Pitfalls閱讀 7,743評(píng)論 0 2
  • 人生不過四季:春、夏唉锌、秋隅肥、冬 四季隨能輪回 但生命不會(huì)重來 只有春種一粒粟 才能秋收萬(wàn)顆子 其實(shí),生命不過三天 昨...
    TWE閱讀 1,584評(píng)論 0 0
  • 今日大致做到了袄简,看待世界有了另一種感官腥放,我很累,我很想媽媽绿语。
    行者dx閱讀 94評(píng)論 0 0
  • 清風(fēng)送明月秃症,誰(shuí)又伴清風(fēng)?回首已枉然吕粹,瀟瀟煙雨中种柑。半醉入半夢(mèng),殘花非殘景匹耕。冥冥得真知聚请,灑脫今后生。
    bccea1a20a8c閱讀 183評(píng)論 0 1