摘要:現(xiàn)在有一個,返回的都是標簽或者內(nèi)容,比如表示,每一個括號及其內(nèi)容是一個,請問如何表示這個文件。棧法復(fù)雜度時間空間思路這題首先要想清楚的是,如何表示,因為是典型的一父多子,我們用樹來表示比較好。如果是一個的,則把上一層節(jié)點彈出棧。
Parse XML Tree
棧法 復(fù)雜度現(xiàn)在有一個Tokenizer,返回的Token都是XML標簽或者內(nèi)容,比如(open, html)(inner, hello)(close, html)表示hello,每一個括號及其內(nèi)容是一個Token,請問如何表示這個XML文件。
時間 O(N) 空間 O(N)
思路這題首先要想清楚的是,如何表示XML,因為XML是典型的一父多子,我們用樹來表示比較好。然后分析下如何用Tokenizer,Tokenizer有點像Iterator,每當我們用Tokenizer拿到一個Token時,如果這是一個Open的Token,我們需要新建一個節(jié)點,這個新節(jié)點下面也有可能有新節(jié)點。如果是一個Inner的Token,我們也需要新建一個節(jié)點,但這個節(jié)點下面不會有新的節(jié)點。如果是一個Close的Token,我們不需要新節(jié)點,而且需要保證上一個Open節(jié)點不再接納新節(jié)點了,而對于新節(jié)點則要附在上一層的節(jié)點后面。這里,我們用棧可以保留上一層的節(jié)點信息,幫助我們建樹。如果這是一個Open的Token,我們需要新建一個節(jié)點加入上一層節(jié)點后面,并加入棧中。如果是一個Inner的Token,我們也需要新建一個節(jié)點加到上一層節(jié)點后面,但不加入棧中。如果是一個Close的Token,則把上一層節(jié)點彈出棧。
代碼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){ // 以右括號為delimiter StringTokenizer tknz = new StringTokenizer(str, ")"); Stackstk = new Stack (); // 將第一個open節(jié)點作為根節(jié)點壓入棧中 XMLNode root = convertTokenToTreeNode(tknz.nextToken()); stk.push(root); while(!stk.isEmpty()){ if(!tknz.hasMoreTokens()){ break; } XMLNode curr = convertTokenToTreeNode(tknz.nextToken()); // 得到上一層節(jié)點 XMLNode father = stk.peek(); // 根據(jù)當前節(jié)點的類型做不同處理 switch(curr.type){ // 對于Open節(jié)點,我們把它加入上一層節(jié)點的后面,并加入棧中 case "open": father.children.add(curr); stk.push(curr); break; // Close節(jié)點直接把上一層Pop出來就行了,這樣就不會有新的節(jié)點加到上一層節(jié)點后面 case "close": stk.pop(); break; // Inner節(jié)點只加到上一層節(jié)點后面 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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66182.html
摘要:算子背后是實現(xiàn)的一些算法組件機器學(xué)習(xí)前端交互機器學(xué)習(xí)平臺前端主要是將機器學(xué)習(xí)的流程裝成一個,定義各個算子的出入?yún)ⅲ约八阕拥呐渲脜?shù),組裝成一個文件,傳給調(diào)圖平臺是方式交互,是通過文件定義,通過。 什么是DAG? 有向無環(huán)圖 樹形結(jié)構(gòu):除根節(jié)點,每個節(jié)點有且僅有一個上級節(jié)點,下級節(jié)點不限。根節(jié)點沒有上級節(jié)點。 圖結(jié)構(gòu):每個節(jié)點上級、下級節(jié)點數(shù)不限。 DAG調(diào)度平臺的定義及場景 任務(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...
摘要:自定義標簽在講解自定義標簽解析之前,先看下如何自定義標簽定義文件定義一個文件描述組件內(nèi)容聲明命名空間值得注意的是與可以是不存在,只要映射到指定就行了。 Spring是一個開源的設(shè)計層面框架,解決了業(yè)務(wù)邏輯層和其他各層的松耦合問題,將面向接口的編程思想貫穿整個系統(tǒng)應(yīng)用,同時它也是Java工作中必備技能之一... 前言 在 上一節(jié) Spring解密 - 默認標簽的解析 中,重點分析了...
摘要:不使用外部聲明屬性單雙引號皆可大小寫敏感大小寫不敏感必須有根元素實體引用實體任何包含數(shù)據(jù)的項實體中要使用轉(zhuǎn)義字符無論寫什么,都當作普通文本逐行掃描,邊掃描邊解析,速度快不能對節(jié)點進行修改構(gòu)造,方便遍歷和修改對于大文件,內(nèi)存壓力大獲取子 XML: EXtensible Markup Language 1. Basic Syntax 1.1 Processing instruction ...
閱讀 794·2021-11-12 10:36
閱讀 3373·2021-09-08 10:44
閱讀 2745·2019-08-30 11:08
閱讀 1402·2019-08-29 16:12
閱讀 2673·2019-08-29 12:24
閱讀 896·2019-08-26 10:14
閱讀 684·2019-08-23 18:32
閱讀 1173·2019-08-23 17:52