Имя пользователя:
Пароль:
 

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
#include <iostream>
using namespace std;

int main()
{
    int balance = 0; 
    char ch;

    while(balance>=0 && (cin >> ch) && ch!='#')
    {
       switch(ch) {
         case '(' : ++balance; break;
         case ')' : --balance; break;
      }
    }

   if (balance==0) cout << "всё зашибись!\n";
   else cout << "следи на руками ;)\n";
   return balance==0;
}
Принцип работы: представим скобки в виде дерева: открыли скобку - перешли на дочерний уровень, закрыли скобку - ввернулись с дочернего уровня. Нас интересует баланс, то есть чтобы пройдя всё выражение ни разу не выйти за корень и в конце остаться в корне. Обозначим переменной balance глубину дочерней ветки (то есть количество незакрытых скобок).
При чтении с клавиатуры ввод построчно буфферизуется. Поэтому чтобы реально программа остановилась, надо после диеза (#) всё-таки нажать enter.
Для демонстрации того, для чего нужен с++:
Код: Выделить весь код
template<typename ForwardIterator>
bool is_balanced(ForwardIterator first, ForwardIterator last)
{
    int balance = 0; 

    for(; balance>=0 && first!=last && *first!='#'; ++first)
    {
       switch(*first) {
         case '(' : ++balance; break;
         case ')' : --balance; break;
      }
    }

   return balance==0;
}

int main()
{
   // можно так: (из строки в памяти, как делали все)
   string data1;
   getline(cin, data1, char());
   cout << is_balanced(data1.begin(), data1.end()) << "\n";

  // а можно и так: (сразу из потока)
  cout << is_balanced(streambuf_iterator<char>(cin), streambuf_iterator<char>()) << "\n";
}
про итераторы много информации, я читал в хелпе от билдера (bcb4stl.hlp)

Последний раз редактировалось pva, 19-09-2009 в 21:55. Причина: небольшое описалово

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:14, 19-09-2009 | #4