вот мой код, теперь он работает нормально, но не дает желаемого результата
ex для eq {a + (b-c) * d} вывод должен быть
"скоба совмещена выскакивать)
скобка совпадает, выскакивает} "
но выход
"брекет-доза не согласована"
#include <bits/stdc++.h>
using namespace std;
main() {
string exp;
cin >> exp;
// cin.getline(exp);
stack <char> s;
for(int i = 0; exp[i] != '\0'; i++) {
if (exp[i] == '{' || exp[i] == '(' || exp[i] == '[') {
s.push(exp[i]);
continue;
} else if (exp[i] == '}' || exp[i] == ')' || exp[i] == ']') {
if (s.top() == exp[i]) {
cout << "bracket matched popping " << s.top() << endl;
s.pop();
continue;
} else {
cout << "bracket dose not matched" << endl;
break;
}
} else {
continue;
}
}
}
Также вам не нужны эти операторы continue
, цикл все равно продолжится. Также не зацикливайтесь до нулевого терминатора, std::string
может иметь его где угодно (и старые версии стандарта C++ этого не требовали). В любом цикле по длине используйте итераторы на основе диапазона for
.
Если вам нужна помощь с ошибкой компилятора, вам действительно нужно сказать, в какой строке есть ошибка.
и ваш код не проверяйте отсутствующие])} в конце
спасибо @Someprogrammerdude У меня есть цифра 1 в конце кода, но я хочу проверить, находятся ли скобки в правильном положении или нет в данном уравнении, но если я ошибаюсь, любая помощь приветствуется
Я понял, что было не так в моем коде после пробного запуска, спасибо за ваше время
Эта строка неверна, строки C++ не оканчиваются нулем
for(int i = 0; exp[i] != '\0'; i++) {
Сделай это
for(size_t i = 0; i < exp.size(); i++) {
У них гарантированно будет \0
в конце, по крайней мере, начиная с C++ 11, не так ли? Такое условие цикла дало бы неверные результаты, если у вас есть \0
в середине вашей строки, да; но это не то, что происходит в случае OP.
@HolyBlackCat, Приятно знать, еще один случай, когда мой C++ устарел. Хотя все же предпочел бы увидеть мою версию цикла.
Я сделал это и теперь также изменил свой код, но теперь он также меняет мой вывод
потому что (не) не [не] и не {не}
когда вы читаете (вам нужно нажать a), а не (и т. д., или вам нужно изменить тестовый (s.top() == exp[i])
Так очевидно! И все же так легко не заметить.
Ваше сравнение для совпадения скобок неверно:
if (s.top() == exp[i]) {
Это будет означать, что вы ожидаете '(' закрыть '('.
Вам нужно расширить это сравнение до соответствующей ожидаемой открывающей скобки - то есть, если вы в настоящее время встречаете ']', вам нужно проверить наличие '[' в стеке; не проверяйте равенство, а проверяйте явно значения s.top () и exp [i]; просто чтобы дать вам представление:
} else if (exp[i] == '}' || exp[i] == ')' || exp[i] == ']') {
if ((s.top() == '(' && exp[i] == ')') ||
//... check for '[' matching ']' and '(' matching ')'...
Да, я понял, поэтому проверяю, что мне делать
Прежде всего, пожалуйста, прочтите Почему мне не следует #include <bits / stdC++. H>?. Во-вторых, отредактируйте свой вопрос, включив комментарий к строке, в которой вы получаете сообщение об ошибке (а также включите вывод ошибки, скопированный с помощью полный и полный).