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

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}");

}

2
你试过在调试器中逐步执行代码,看看实际发生了什么吗? - Paul R
“doesn't seem to do anything” - 这里需要更多的信息。 - Karthik T
你有相当多的冗余。也许你应该有一个 bool pop_if_possible(std::stack<char>, char) 方法,这样你就可以写成 if (c==')' && !pop_if_possible(stack, '(')) { return false; } - MSalters
我已经成功让程序运行了,只是不确定如何使用实际函数使其返回1或0来判断是否匹配? - Alan Gordon
4个回答

6

您为什么认为它什么也没做呢?它确实有作用。它检查大括号,但您没有使用checkBraces的返回值,顺便说一下,它应该返回一个bool而不是一个int

您可能是想表达:

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

专业提示:学会如何使用调试器。在编写超过“hello world”的任何代码之前,您应该先学习如何进行调试。


“{(})”已被考虑在内:当遇到“}”时,栈顶将是“(”。 - MSalters
@MSalters 嗯,没错,我漏掉了这个。 - Luchian Grigore
好的,好的。使用您提供给我的IF语句后,我的程序似乎运行得非常好。我只需要能够提示用户输入一个字符串并返回1或0。我认为可以通过将该方法更改为布尔值而不是整数来实现这一点? - Alan Gordon
@AlanGordon 不,要获取用户输入,你需要使用std::cin(谷歌)。 - Luchian Grigore
Re 在你开始编写比“hello world”更复杂的代码之前,你应该学会如何调试:赞同。如果可以的话,我会给它+10甚至更多分。有时候很遗憾我们不能在SO上“早投票,多投票”。 - David Hammen

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

您至少应该打印checkBraces的输出结果。


1
它确实有作用。它打印出“此程序检查字符串中的括号([{}])匹配”。你正在调用“checkBraces("{1+1}")”,但你没有对返回值做任何操作。由于这个调用可以被优化掉,你在某种意义上是正确的,即你的程序似乎没有做任何事情。所以让它做点什么吧。先打印要测试的字符串,然后打印测试结果。完成后,您应该进行测试,而且当您完成测试后,您应该继续测试。不要只测试像{ i+1 }这样的简单情况。测试应该通过的复杂情况,也测试应该失败的情况。学习如何测试和调试与学习如何编写代码一样重要(如果不是更重要的技能)。

我简直不敢相信,我所要做的就是cout << checkBraces (input);我的程序运行得非常好,谢谢。我已经测试了几个案例,我只是使用了那一个,因为我知道它应该返回1。 - Alan Gordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接