摘要:現(xiàn)在有一個(gè),返回的都是標(biāo)簽或者內(nèi)容,比如表示,每一個(gè)括號(hào)及其內(nèi)容是一個(gè),請(qǐng)問如何表示這個(gè)文件。棧法復(fù)雜度時(shí)間空間思路這題首先要想清楚的是,如何表示,因?yàn)槭堑湫偷囊桓付嘧?,我們用樹來表示比較好。如果是一個(gè)的,則把上一層節(jié)點(diǎn)彈出棧。
Parse XML Tree
棧法 復(fù)雜度現(xiàn)在有一個(gè)Tokenizer,返回的Token都是XML標(biāo)簽或者內(nèi)容,比如(open, html)(inner, hello)(close, html)表示hello,每一個(gè)括號(hào)及其內(nèi)容是一個(gè)Token,請(qǐng)問如何表示這個(gè)XML文件。
時(shí)間 O(N) 空間 O(N)
思路這題首先要想清楚的是,如何表示XML,因?yàn)閄ML是典型的一父多子,我們用樹來表示比較好。然后分析下如何用Tokenizer,Tokenizer有點(diǎn)像Iterator,每當(dāng)我們用Tokenizer拿到一個(gè)Token時(shí),如果這是一個(gè)Open的Token,我們需要新建一個(gè)節(jié)點(diǎn),這個(gè)新節(jié)點(diǎn)下面也有可能有新節(jié)點(diǎn)。如果是一個(gè)Inner的Token,我們也需要新建一個(gè)節(jié)點(diǎn),但這個(gè)節(jié)點(diǎn)下面不會(huì)有新的節(jié)點(diǎn)。如果是一個(gè)Close的Token,我們不需要新節(jié)點(diǎn),而且需要保證上一個(gè)Open節(jié)點(diǎn)不再接納新節(jié)點(diǎn)了,而對(duì)于新節(jié)點(diǎn)則要附在上一層的節(jié)點(diǎn)后面。這里,我們用??梢员A羯弦粚拥墓?jié)點(diǎn)信息,幫助我們建樹。如果這是一個(gè)Open的Token,我們需要新建一個(gè)節(jié)點(diǎn)加入上一層節(jié)點(diǎn)后面,并加入棧中。如果是一個(gè)Inner的Token,我們也需要新建一個(gè)節(jié)點(diǎn)加到上一層節(jié)點(diǎn)后面,但不加入棧中。如果是一個(gè)Close的Token,則把上一層節(jié)點(diǎn)彈出棧。
代碼public class XMLParser { public static void main(String[] args){ XMLParser xml = new XMLParser(); XMLNode root = xml.parse("(open,html)(open,head)(inner,welcome)(close,head)(open,body)(close,body)(close,html)"); xml.printXMLTree(root, 0); } public XMLNode parse(String str){ // 以右括號(hào)為delimiter StringTokenizer tknz = new StringTokenizer(str, ")"); Stackstk = new Stack (); // 將第一個(gè)open節(jié)點(diǎn)作為根節(jié)點(diǎn)壓入棧中 XMLNode root = convertTokenToTreeNode(tknz.nextToken()); stk.push(root); while(!stk.isEmpty()){ if(!tknz.hasMoreTokens()){ break; } XMLNode curr = convertTokenToTreeNode(tknz.nextToken()); // 得到上一層節(jié)點(diǎn) XMLNode father = stk.peek(); // 根據(jù)當(dāng)前節(jié)點(diǎn)的類型做不同處理 switch(curr.type){ // 對(duì)于Open節(jié)點(diǎn),我們把它加入上一層節(jié)點(diǎn)的后面,并加入棧中 case "open": father.children.add(curr); stk.push(curr); break; // Close節(jié)點(diǎn)直接把上一層Pop出來就行了,這樣就不會(huì)有新的節(jié)點(diǎn)加到上一層節(jié)點(diǎn)后面 case "close": stk.pop(); break; // Inner節(jié)點(diǎn)只加到上一層節(jié)點(diǎn)后面 case "inner": father.children.add(curr); break; } } return root; } private XMLNode convertTokenToTreeNode(String token){ token = token.substring(1); String[] parts = token.split(","); return new XMLNode(parts[0], parts[1]); } private void printXMLTree(XMLNode root, int depth){ for(int i = 0; i < depth; i++){ System.out.print("-"); } System.out.println(root.type + ":" + root.value); for(XMLNode node : root.children){ printXMLTree(node, depth + 1); } } } class XMLNode { String type; String value; List children; XMLNode(String type, String value){ this.type = type; this.value = value; this.children = new ArrayList (); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/66182.html
摘要:算子背后是實(shí)現(xiàn)的一些算法組件機(jī)器學(xué)習(xí)前端交互機(jī)器學(xué)習(xí)平臺(tái)前端主要是將機(jī)器學(xué)習(xí)的流程裝成一個(gè),定義各個(gè)算子的出入?yún)?,以及算子的配置參?shù),組裝成一個(gè)文件,傳給調(diào)圖平臺(tái)是方式交互,是通過文件定義,通過。 什么是DAG? 有向無環(huán)圖 樹形結(jié)構(gòu):除根節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有且僅有一個(gè)上級(jí)節(jié)點(diǎn),下級(jí)節(jié)點(diǎn)不限。根節(jié)點(diǎn)沒有上級(jí)節(jié)點(diǎn)。 圖結(jié)構(gòu):每個(gè)節(jié)點(diǎn)上級(jí)、下級(jí)節(jié)點(diǎn)數(shù)不限。 DAG調(diào)度平臺(tái)的定義及場(chǎng)景 任務(wù)調(diào)度...
Abstract There is an article shows demo code for making XMLSignature by using Java XML Digital Signature API, where it actually uses org.jcp.xml.dsig.internal.dom.XMLDSigRI to do DOM formation, and th...
摘要:自定義標(biāo)簽在講解自定義標(biāo)簽解析之前,先看下如何自定義標(biāo)簽定義文件定義一個(gè)文件描述組件內(nèi)容聲明命名空間值得注意的是與可以是不存在,只要映射到指定就行了。 Spring是一個(gè)開源的設(shè)計(jì)層面框架,解決了業(yè)務(wù)邏輯層和其他各層的松耦合問題,將面向接口的編程思想貫穿整個(gè)系統(tǒng)應(yīng)用,同時(shí)它也是Java工作中必備技能之一... 前言 在 上一節(jié) Spring解密 - 默認(rèn)標(biāo)簽的解析 中,重點(diǎn)分析了...
摘要:不使用外部聲明屬性單雙引號(hào)皆可大小寫敏感大小寫不敏感必須有根元素實(shí)體引用實(shí)體任何包含數(shù)據(jù)的項(xiàng)實(shí)體中要使用轉(zhuǎn)義字符無論寫什么,都當(dāng)作普通文本逐行掃描,邊掃描邊解析,速度快不能對(duì)節(jié)點(diǎn)進(jìn)行修改構(gòu)造,方便遍歷和修改對(duì)于大文件,內(nèi)存壓力大獲取子 XML: EXtensible Markup Language 1. Basic Syntax 1.1 Processing instruction ...
閱讀 877·2021-11-12 10:36
閱讀 3477·2021-09-08 10:44
閱讀 2804·2019-08-30 11:08
閱讀 1464·2019-08-29 16:12
閱讀 2739·2019-08-29 12:24
閱讀 980·2019-08-26 10:14
閱讀 760·2019-08-23 18:32
閱讀 1243·2019-08-23 17:52