5

中かっこがランダムな文字列または文字で次のように一致するかどうかを確認するためのボーナスプログラミングチャレンジとして求められました:{1 + 1}これは1を返し、{1 + 1})は0を返します。これは私が持っているものですこれまでのところ、それは何もしていないようです。何か助けがあればいいですか?ありがとう

//bonus.cpp
#include <iostream>
#include <string>
#include <queue>
#include <stack>

using namespace std;

int checkBraces (string s)
{
    //int myLength = s.length();
    std::stack<int> stack;
    char d;

    for (int i = 0; i < s.length(); i++)
    {
        char c = s[i];

        if (c == '(')
        {
            stack.push(c);
        }
        else if (c == '[') 
        {
            stack.push(c);
        }
        else if (c == '{')
        {
            stack.push(c);
        }

        else if (c == ')')
        {
            if (stack.empty())
            {
                return false;
            }
            else
            {
                d = stack.top();
                stack.pop();
                if (d != '(')
                {
                    return false;
                }
            }
        }

        else if (c == ']')
        {
            if (stack.empty())
            {
                return false;
            }
            else
            {
                d = stack.top();
                stack.pop();
                if (d != '[')
                {
                    return false;
                }
            }
        }
        else if (c == '}')
        {
            if (stack.empty())
            {
                return false;
            }
            else
            {
                d = stack.top();
                stack.pop();
                if (d != '{')
                {
                    return false;
                }
            }
        }
    }

    if (stack.empty()) return true;
    else return false;

}


int main()
{
    cout << "This program checks brace ([{}]) matching in a string." << endl;

    checkBraces ("{1+1}");

}
4

4 に答える 4

6

何が起こらないと思うのですか?します。中括弧をチェックしますが、の戻り値では何もしていません。checkBracesところで、 。boolではなく、を返す必要がありintます。

あなたはおそらく次のようなことを意味しましたか?

if (checkBraces ("{1+1}"))
   cout << "matching";
else
   cout << "not matching";

プロのヒント:デバッガーの使用方法を学びます。「HelloWorld」以外のもののコーディングを開始する前に、デバッグ方法を学ぶ必要があります。

于 2012-12-07T09:36:53.220 に答える
3

すでに述べたことに加えて、コードの量を減らすことができると思います。とにかくあなたはあなたのスタックにcharsを入れます、なぜ持っていないのstd::stack<char>ですか?

中括弧を別の文字列に保存して、 std::algorithmsの1つを使用して自動的に比較することができます

const std::string openingBraces("{[(");
const std::string closingBraces("}])");

if (std::find(openingBraces.begin(), openingBraces.end(), currentChar) != openingBraces.end())
    yourStack.push(currentChar);
else if (std::find(closingBraces.begin(), closingBraces.end(), currentChar) != closingBraces.end())
{
    // check if currentChar is matching the one on top of your stack
}

自分で答えを見つける方が常に良いので、私はすべてを書いたわけではありません。

于 2012-12-07T10:01:16.317 に答える
2

最低限必要なことは、checkBracesの結果を印刷することです。

于 2012-12-07T09:38:24.247 に答える
1

しかし、それは何もしないようです

それは何かをします。印刷しThis program checks brace ([{}]) matching in a string.ます。

呼び出しcheckBraces ("{1+1}")ていますが、戻り値に対して何もしていません。この呼び出しは最適化できるので、プログラムが何もしていないように見えるという意味で正しいです。

だからそれを何かさせなさい。テストする文字列を印刷してから、テストの結果を印刷します。それが終わったら、テストする必要があります。それが終わったら、さらにテストする必要があります。のような簡単なケースをテストするだけではいけません{i+1}。合格するはずの複雑なケースと、不合格になるはずのテストケースをテストします。

テストの方法とデバッグの方法を学ぶことは、コードの書き方を学ぶことと同じくらい重要なスキルです(より重要なスキルではないにしても)。

于 2012-12-07T10:04:15.170 に答える