0

我正在尝试为 C++ 分配解析 HTML 文件。作业是演示堆栈;我们应该在每次点击标签时推送到堆栈,然后在找到相应的结束标签时弹出。

老师显然希望我们硬编码一组标签来检测,比如:

// Declare some stacks
Stack html;
Stack div;
...

// When you find an open tag, push to the corresponding stack
if (tagcontents == "html") { html.push(); }
if (tagcontents == "div") { div.push(); }
...

// When you find a close tag, push to the corresponding stack
if (tagcontents == "/html") { html.pop(); }
if (tagcontents == "/div") { div.pop(); }
...

这样做的明显缺点是,如果我想支持HTML 中可用的所有标签,我可以期望进行大量冗余编码。老师显然希望我们只选择可用标签的一小部分,然后去掉那些,但我认为这很蹩脚。由于我很懒(而且我坚信所有程序员都应该如此),我正在尝试提出一个动态解决方案。

这个想法是,每当我遇到一个新标签时,为它创建一个堆栈。这将允许我的程序支持任何标签,无论其有效性如何。不过,我遇到了一个有趣的理论问题,我什至不知道该怎么称呼它来研究它。也就是说,我需要使用变量的 VALUE 作为我实际代码的一部分。IE:

if (no stack exists named "HTML") { create a stack named "HTML" }

简单来说,我怎么能:

tag = "html";
Stack tag;  // make a stack named HTML?

还是有其他方法可以做到这一点?任何帮助将不胜感激。如果我无法弄清楚这一点,我可能会像退出者一样使用 switch/case 语句。

4

4 回答 4

0

这是一个例子:

#include <stdio.h>
#include <map>
#include <string>
#include <list>
#include <iostream>

typedef std::list<std::string> stack;
typedef std::map<std::string, stack> stack_map;

stack_map my_stacks;

stack& getStack(const std::string& stack_name) {
   stack_map::iterator it = my_stacks.find(stack_name);
   if( it != my_stacks.end() ) {
      return it->second;
   } else {
      my_stacks[stack_name] = stack();
      return my_stacks[stack_name];
   }
}


...
stack& div_stack = getStack("div");

// and use that for example
div_stack.push_back("some info");
div_stack.push_back("some more info ... ");
div_stack.push_back("s  even more ... ");

.....
于 2012-04-15T18:53:03.393 回答
0

std::map<std::string, Stack>.

于 2012-04-15T18:43:06.550 回答
0

使用地图/无序地图:

std::map <std:string, Stack> myStacks;

然后你可以做

myMastacks[tagcontents].push()

如果密钥尚不存在,这将为密钥初始化一个新堆栈。

在标签的末尾,去掉斜线,检查它是否在地图上,然后就可以了。

于 2012-04-15T18:43:50.747 回答
0

我会做不同的事情,更简单,所有标签只有一个堆栈(我认为这是非常合理的,除非你的老师真的指示你使用几个堆栈):声明一堆字符串。一个字符串代表一个标签。您可以为此使用 STL 堆栈:

stack<string> my_tags;

my_tags.push("div")将“div”推入堆栈。 string tag = my_tags.top();将查询堆栈的顶部,并my_tags.pop()从堆栈中弹出顶部项目。很容易 :-)

同样,如果您真的不需要练习几个堆栈,但要检查您在 html 解析中的位置,这个解决方案是很好的。

于 2012-04-15T18:44:59.480 回答