题意:
解题思路:
(这个题的长度我是服气的哈,看了快半个小时)
这里采用树来存储文档结构信息,可以根据输入顺序对文档结构树进行先序遍历,再根据选择器的查找方式可以确定使用树的双亲表示法的存储结构就已经能满足查找要求。
将一行文档结构信息视为树的一个结点信息(后文的文档结构信息简称为结点信息),所有的结点用一个向量或数组来保存。
定义结点类型。一个结点应至少记录以下信息:元素(标签)、属性和父结点在向量中的位置(这里用下标来表示)。由于对于每行输入信息需要自行确定其父结点的位置,且输入字符串中唯一能利用做到这一点的数据就是“.”的个数(相当于结点的深度)。因此结点信息中还要记录结点的深度
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
typedef struct HTML
{
string elem = ""; //记录元素即标签
string id = ""; //记录属性
int deep = 0; //记录深度,规定根节点即html的深度为0
int father = 0; //此结点的父亲在向量中的下标
}HTML;
vector<HTML> v(110); //存放各结点,下标等于行号,故从1开始存储
HTML readString(string s)
{
HTML temp;
enum STATE {
BEGIN, DOT, ELEM, ID };
STATE state = BEGIN;
int deep = 0;
bool even = false; //用来判断‘.’出现次数是否为偶数次
for(unsigned i = 0; i < s.size(); i++)
{
switch(state)
{
case BEGIN:
if(s[i] == '.') {
i--; state = DOT; break; }
else {
i--; state = ELEM; break; }
case DOT:
if(s[i] != '.') {
temp.deep = deep; i--; state