• Дано N строк. Вывести для каждой строки Good, если она - правильное скобочное выражение и Bad, если нет.

Ответы 2

  • Для проверки, закрыты ли все скобки, можно было бы просто их посчитать, но мы будем проверять правильность вложенности. Для этого нам пригодится std::stack (да, и решаем на С++). #include <iostream>#include <stack>#include <string>using namespace std;typedef unsigned short int USI;bool hasCorrectBracing(string);int main(){ setlocale(0, ""); // кириллица USI N; cout << "N = "; cin >> N; string row; for(size_t i = 1; i <= N; i++) { cout << "Строка " << i << ": "; cin >> row; if ( hasCorrectBracing(row) ) { cout << "Good"; } else { cout < "Bad"; } } return 0;}bool hasCorrectBracing(string r){ stack <char> st; for(string::size_type c = 0; c < r.size(); c++) { if (r[c] == '(') { st.push('('); continue; } else { if (r[c] == '[') { st.push('['); continue; } else { if (r[c] == '{') { st.push('{'); continue; } } } // end 1st if if ( ( (st.top() == '(') && (r[c] == ')') ) || ( (st.top() == '[') && (r[c] == ']') ) || ( (st.top() == '{') && (r[c] == '}') ) ) { st.pop(); } //end 2nd if } // end for if ( st.empty() ) { return true; } else { return false; }} // end fun
  • Посмотрел решение на С++. Ну что же, я недаром зову его "полуассемблер" - нечего ему в общеобразовательных школах делать... Писать долго, много и непонятно для непосвященных. А сколько при этом можно ошибок сделать - просто жуть.Вот для сравнения решение на Паскале. Я тоже использовал стек, чтобы проще было сравнивать)))// PascalABC.NET 3.2, сборка 1370 от 24.12.2016// Внимание! Если программа не работает, обновите версию!function IsGood(s:string):Boolean;begin  var St:=new Stack<char>;  foreach var c in s do    case c of    '(':St.Push(c);    ')':if St.Count>0 then St.Pop        else begin Result:=false; Exit end;    end;  Result:=St.Count=0end; begin  var n:=ReadlnInteger('N=');  var s:=ReadArrString(n);  s.Select(x->IsGood(x)).Select(x->x?'Good':'Bad').Println(NewLine)end.Контрольный пример (скобки "разбавлены" числами, чтобы было ясно, что программа не только скобки умеет читать, но и проверять их расстановку в произвольной строке)N= 412(3)456(7)8123((67)8)12)34(5(1(234)567GoodGoodBadBad
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years