我将使用C#创建一个哈希表,并在此哈希表的每个销售中存储一些Html标记。然后,我想编写一个算法来从Hash表中读取代码,并在输出中以语义和正确的方式演示它们。
例如:如果我的哈希表中有这样的东西:
<html>|<title>|</head>|</html>|</title>|<head>|...
-----------------------------------------------------
最终输出将是正确的输出:
<html>
<head>
<title>
</title>
</head>
</html>
...
通过这种方式,我有三个主要问题:
我将感激,如果你告诉我你的想法,如果你的观点中缺少一些信息,请告诉我,我会提供这些信息,以便更好地帮助我。
提前致谢
答案 0 :(得分:0)
如果我理解你的问题是正确的,那么您似乎无法正常处理标签,然后您想要正确地订购它们。这样做并不容易......
让我尝试构建一个正是这样做的系统,然后你会看到隐藏在后面的所有复杂性。
每个标签都必须用密钥表示。标签要么打开(例如<html>
),要么关闭(例如</html>
),要么为空(例如<html />
)。前两个表单必须成对出现,因此记住这两个表单似乎没有意义 - 无论如何,缺少结束标记是一个错误,您可能决定自动更正此类错误。
因此,您可以描述具有结构的标记(Tag,RequiresClose),然后构建一个映射string -> bool
的哈希表或字典,其中布尔值表示标记是否需要相应的结束标记:
<html>|<title>|</head>|</html>|</title>|<head>
这些标签会填充字典,如:
html -> true
title -> true
head -> true
然后你需要为这个字典构建一个解释器,它将构造标签的输出序列。下面是解释器的伪代码。
Interpret()
InterpretHtml()
InterpretHtml()
if html not present in dictionary then quit
if dictionary['html'] = false then print <html /> and quit
print <html>
InterpretHead()
InterpretBody()
print </html>
remove html from dictionary
InterpretHead()
if head not present in dictionary then quit
if dictionary['head'] = false then print <head /> and quit
print <head>
InterpretTitle()
print </head>
remove head from dictionary
InterpretTitle()
if title not present in dictionary then quit
if dictionary['title'] = false then print <title /> and quit
print <title>
// somehow find the title and print it
print </title>
remove title from dictionary
这种方法很乏味,并且不会产生可预测的输出。
因此,我建议您彻底重新考虑您的任务,并以完全不同的方式进行。由于HTML正在生成分层文档,您可能需要考虑使用堆栈,然后在输入上强制正确的标记顺序。