0

私は C++ コンソール アプリを作成していますが、中かっこの最初のペアを保持しているスタックと比較して、中かっこを一致させて true にすることができないという問題があります。このアルゴリズムが挿入されるメソッドには、ベクトル トークン パラメーターがあります。私のコードを数回書いて書き直しました。次の投稿では、私がやろうとしていることのいくつかのアイデアを示すために、非常に単純なコードを配置しています。

スタックデリ;

for (size_t i=0; i<ie.size(); i++) {        
    if(ie[i].value =="{"|| ie[i].value =="(" || ie[i].value =="[")  

     {deli.push(ie[i].value);

        if(deli.top() != "}" || deli.top() != ")" || deli.top() != "]"){
        return false;
           deli.pop(); 
        }

          if(deli.top() == "}" || deli.top() != ")" || deli.top() != "]"){
              return true;
        }

    }


}//end of for loop
4

3 に答える 3

0

これは任務用だと思いますか?

いくつかのヒントを次に示します。

  • if/else if ステートメントのようなものを使用して、開き括弧を取得するケースと閉じ括弧を取得するケースを分離します

  • 開いたブラケットを取得したら、それをスタックにプッシュする必要があります。

  • 閉じ括弧を取得したら、スタックの一番上を確認して、同じタイプの関連付けられた開き括弧があるかどうかを確認し (これが関連している場合)、スタックをポップしてその開き括弧を削除します。

  • ループが終了すると、スタックが空になるか、エラーが発生します

おそらくこの構造が必要です:

for (size_t i=0; i<ie.size(); i++)
{
    if (/*conditions for open brackets*/) 
    {
        //Push the bracket on the stack
    }
    else if (/*conditions for closing brackets*/)
    {
        //Check the top of the stack if there is an opening bracket
        //If so, pop the stack. If not, error.
    }
}
于 2013-09-23T05:34:18.007 に答える
0

あるタイプのブラケットを他のタイプと一致させるのではなく、任意のタイプのブラケットを他のタイプと一致させるため、コードは確実に機能しません。
解決策の 1 つは、中かっこ、角かっこ、かっこを見つけたときに数え、その数が一致したときに数えることです。
他の解決策は、コンパイラの構築に関連する、より一般的なものです。そのテーマを勉強したことがあれば、コンテストフリーの文法を書き、それを決定論的有限オートマトン (DFA) に変換し、入力を解析するプログラムを書くことができるはずです。深い研究が必要ですが、本当に役に立ちます。

于 2013-09-23T06:28:18.943 に答える