(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=105)
Приклад.
Введення:
(a+b)
Виведення:
True
Задача. Дано алгебраїчний вираз з дужками, записаний одним рядком. Вірно чи не вірно в ньому розставлено дужки?
Технічні умови. Програма читає з клавіатури рядок з виразом (не довший за 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;
}
#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;
}
* Розв'язання, на мою думку вірне, але не проходить жодного тесту....
Немає коментарів:
Дописати коментар