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?

または、これを行う別の方法はありますか?どんな助けでも大歓迎です。これがわからない場合は、おそらくquitterのようにswitch/caseステートメントを使用します。

4

4 に答える 4

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

すべてのタグに対して 1 つのスタックのみを使用して、別の方法でより単純に行います (教師が実際に複数のスタックを使用するように指示しない限り、これは非常に合理的だと思います): 文字列のスタックを宣言します。文字列はタグを表します。これには 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 に答える
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 に答える