четвер, 26 лютого 2015 р.

Brackets

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=105)

Задача. Дано алгебраїчний вираз з дужками, записаний одним рядком. Вірно чи не вірно в ньому розставлено дужки?

Технічні умови. Програма читає  з клавіатури рядок з виразом (не довший за 255 символів). Програма виводить на екран відповідь у вигляді текстового рядка. Якщо дужки розставлено вірно - друкує слово True, якщо не вірно - False.

Приклад.
Введення:
(a+b)
Виведення:
True
Розв'язання.
У виразі вірно розставлено дужки, якщо кількість відкритих дорівнює кількості закритих і закрита не зустрічається раніше за відкриту. Отже, резервуємо змінну К, яку будемо збільшувати на 1 при зустрічі '('  і відповідно зменшуватимемо при зустрічі ')', та слідкуватимемо щоб К не стало від'ємним (K<0 - ')' зустрічається раніше за '(').
Запишемо алгоритми мовами програмування.

Free Pascal:
Var R : String[255];
    K, I : Integer;
Begin
 Read (R);
 K := 0;
 For I :=1 To Length (R) Do Begin
  Case R[I] Of
   '(' : Inc (K);
   ')' : Dec (K);
  End;
  If K < 0
   Then Break;
 End;
 Write (K = 0);
End.

C++:*
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 char r[256];
 cin >> r;
 int k=0;
 for (int i=0; i<strlen(r); i++) {
  switch (r[i]) {
   case '(' : k++; break;
   case ')' : k--; break;
  }
  if (k<0) break;
 }
 std::cout << std::boolalpha;
 std::cout << (bool)!k;
}

* Розв'язання, на мою думку вірне, але не проходить жодного тесту....

Немає коментарів:

Дописати коментар