Kishaan Jeeveswaran Ответов: 2

Код для проверки сбалансированных скобок во входных данных


Я пытаюсь написать код для проверки пар скобок во входной строке и распечатать либо "успех" (для ввода с совпадающей парой), либо индекс 1 на основе первой несопоставимой закрывающей скобки. Однако я получаю индекс на основе 1 Для даже совпадающих входных скобок. (например. для ввода [ ] я получаю вывод 1 вместо "успеха"). Я понимаю, что в моей логике есть ошибка. Может ли кто-нибудь указать на ошибку?

#include <iostream>
#include <stack>
#include <string>

struct Bracket {
    Bracket(char type, int position):
        type(type),
        position(position)
    {}

    bool Matchc(char c) {
        if (type == '[' && c == ']')
            return true;
        if (type == '{' && c == '}')
            return true;
        if (type == '(' && c == ')')
            return true;
        return false;

    }

    char type;
    int position;
};


int main() {
    std::string text;
    getline(std::cin, text);
    int z;
    int len = text.size();

    std::stack <Bracket> opening_brackets_stack;
    for (int position = 0; position < len ; ++position) {
        char next = text[position];
        Bracket brackObj(next,0);

        if (next == '(' || next == '[' || next == '{') {
            opening_brackets_stack.push(brackObj);
        }

        if (next == ')' || next == ']' || next == '}') {

            if(brackObj.Matchc(next) == false || opening_brackets_stack.empty() == false)
            {
               z = position;
            }

            else
            {
                opening_brackets_stack.pop();
            }
        }
    }

    if (opening_brackets_stack.empty()==true)
    {
        std::cout << "Success";
    }

    else
    {
        std::cout << z;
    }
    return 0;
}


Что я уже пробовал:

Я использую стек, чтобы раздвинуть все открытые скобки и выскочить из них, когда найдется подходящая закрывающая скобка.

Для несоответствующего входа (например, ([{)]) он должен возвращать выход 4 и "успех" для совпадающего входа (например, ({[]})).

[no name]

И когда вы прошли через свой код, изучая значения переменных на каждом этапе пути, что вы обнаружили?

Kishaan Jeeveswaran

Я не инициализировал свое целое число "z". Вы об этом спрашивали?

[no name]

Парень, который пишет код, должен его отлаживать. Вы использовали свой отладчик? Вот для чего он нужен.

Kishaan Jeeveswaran

Я новичок в программировании и раньше не знал об отладчиках. Спасибо, что указали на это! Я использую программное обеспечение Codeblocks. Будет ли отладчик в этом программном обеспечении служить этой цели?

[no name]

Да конечно: http://wiki.codeblocks.org/index.php/Debugging_with_Code::Blocks

Kishaan Jeeveswaran

Спасибо! :)

2 Ответов

Рейтинг:
4

Patrice T

Цитата:
Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
17

OriginalGriff

ГМ...отладчик, вероятно, покажет вам это очень быстро!
Посмотрите, что вы делаете:

if(brackObj.Matchc(next) == false || opening_brackets_stack.empty() == false)
Что такое type из brackObj, когда вы пытаетесь сравнить его с близкой скобкой?
Подсказка: подумайте о том, когда вы создаете каждый новый экземпляр скобки. Это все скобки? Все ли они заключены в открытые скобки?


Kishaan Jeeveswaran

Ну, я новичок в C++ и кодирую с помощью программного обеспечения "codeblocks" в Windows. Отладчик в этом программном обеспечении не показывал никаких ошибок, когда я компилировал и запускал его!

OriginalGriff

Это не отладчик - это компилятор!
Получить код через компилятор очень просто-это все равно что сказать, что предложение является допустимым английским синтаксисом, а не то, что оно имеет смысл или говорит то, что вы на самом деле хотели.
Например, это допустимо синтаксически:
"Подозрительное здание подъехало к магазинам на космическом корабле."
Но бессмысленно по стольким причинам: смеяться:
После компиляции отладчик используется для просмотра того, что происходит во время выполнения кода, чтобы вы могли обнаружить "логические ошибки" и другие ошибки в вашем коде и / или дизайне.
Посмотрите на свой скомпилированный код, а затем на строку меню - там есть меню "отладка", которое позволяет установить точку останова в первой строке вашего метода.
Когда вы запускаете свой код в отладчике, он останавливается, когда достигает точки останова, и позволяет вам взять управление на себя, глядя на переменные и выполняя строки по одной (так называемый одиночный шаг) - к этому стоит привыкнуть, вы будете использовать его много (мы все это делаем!)

Kishaan Jeeveswaran

Большое спасибо, что нашли время написать такой подробный ответ. Настало время, я должен начать использовать его. :)

OriginalGriff

Пожалуйста!