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

c++ checking if braces match

本文关键字:是否 检查 C++      更新时间:2023-10-16

我被要求作为额外的编程挑战,看看大括号是否在随机字符串或字符中匹配,如下所示:{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}");
}

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

你的意思是:

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

专业提示:了解如何使用调试器。在开始编写"hello world"以外的任何内容之前,您应该学习如何调试。

作为已经说过的补充,我会说你可以减少代码量。无论如何,您将字符放入堆栈中,为什么不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
}

我没有写完所有东西,因为自己找到答案总是更好。

您应该做的最低限度是打印复选大括号的结果。

但它似乎什么也没做

它确实做了一些事情。它打印This program checks brace ([{}]) matching in a string. .

您正在调用checkBraces ("{1+1}")但您没有对返回的值执行任何操作。由于此调用可以优化,因此从某种意义上说,您的程序似乎没有执行任何操作是正确的。

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

学习如何

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