c ++检查大括号是否匹配

时间:2012-12-07 09:33:03

标签: c++

我被问到作为奖励编程挑战,看看大括号是否匹配随机字符串或像这样的字符:{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 个答案:

答案 0 :(得分:6)

是什么让你认为它什么都不做?确实如此。它会检查大括号,但是你没有对checkBraces的返回做任何事情,btw应返回bool,而不是int

你的意思可能是:

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

专业提示:了解如何使用调试器。在开始编码之前,你应该学习如何调试,而不是“你好世界”。

答案 1 :(得分:3)

作为对已经说过的内容的补充,我会说你可以减少代码量。无论如何,你把字符放入堆栈,为什么不使用std::stack<char>

您可以将大括号保存到另一个字符串中,以使用std::algorithms之一

自动比较它
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
}

我没有写过所有内容,因为自己总能更好地找到答案。

答案 2 :(得分:2)

你应该做的最小值是打印checkBraces的结果。

答案 3 :(得分:1)

  

但它似乎没有做任何事情

确实有所作为。它会打印This program checks brace ([{}]) matching in a string.

您正在调用checkBraces ("{1+1}"),但您没有对返回的值执行任何操作。由于这个调用可以被优化掉,从某种意义上说,你的程序似乎没有做任何事情。

所以让它做点什么。打印要测试的字符串,然后打印测试结果。一旦你完成了,你应该测试,当你完成它,你应该测试更多。不要仅仅测试{i+1}等简单案例。测试应该通过的复杂案例,并测试应该失败的案例。

学习如何测试和学习如何调试与学习如何编写代码一样重要技能(如果不是更重要的技能)。