Форум программистов, компьютерный форум CyberForum.ru

Баланс скобок - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Изучение С/С++. Олимпиадное программирование http://www.cyberforum.ru/cpp-beginners/thread452346.html
Здравствуйте. Сейчас учусь на первом курсе, изучаю С, потом перейду на С++. В будущем планирую участвовать в олимпиадах по программированию. Какие бы вы могли дать советы по этому поводу (как следует заниматься, какую литературу использовать и т.д.)? Если сами участвовали в олимпиадах, поделитесь опытом. Заранее спасибо.
C++ Имеется N мужчин и N женщин. Имеются также данные о предпочтениях каждого мужчины к каждой женщине. Имеется N мужчин и N женщин. Имеются также данные о предпочтениях каждого мужчины к каждой женщине. Аналогичные данные имеются и для женщин. Требуется составить такой набор пар, чтобы общество, получившееся из таких семей, было наиболее счастливо . (Исходные данные задать самостоятельно). http://www.cyberforum.ru/cpp-beginners/thread452323.html
C++ Записать данные в начало файла
Здравствуйте. Не могли бы вы подсказать еще один вопрос. В файл у меня записывается некоторый текст, данные, символы, и т.д. Как можно после записи уже какого-то количества данных вернуться в начало файла и записать там еще текст. (опять вниз возвращаться не надо) То есть, что-то вроде такого. Вот наш файл с записанными туда уже символами: 123 456 789 А теперь - опять в начало файла...
Не считает разницу векторов C++
#include <iostream> #include <vector> using namespace std; int main() { int i; const int n=7; int x; int y;
C++ Составить из резисторов цепь соединения http://www.cyberforum.ru/cpp-beginners/thread452295.html
Помогите с задачкой пожалуйста с написание програмгного кода Дано N резисторов различных номиналов. Необходимо выбрать несколько резисторов и составить из них цепь последовательного соединения, сопротивление которой наиболее близко к заданному. (задать произвольное)
C++ char *strtor(string1,string2); Привет народ, реально вставить в strtor символ ограничитель " ,если да то как ? Спасибо подробнее

Показать сообщение отдельно
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.02.2012, 16:04     Баланс скобок
что-то как-то хитро сделано.
алгоритм проверки вроде как простой. баланс открывающих и закрыающих скобок должен быть равен нулю.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Переделать на не использование строк, а использование сишных массивов достаточно просто.
bool IsCorrect(const std::string& str)
{
  const char openBracket = '(';
  const char closeBracket = ')';
  int balance = 0;
  for (size_t i = 0, length = str.length(); i < length; ++i)
  {
    const char ch = str[i];
    if (ch == openBracket)
    {
      ++balance;
    }
    else if (ch == closeBracket)
    {
      --balance;
    }
 
    if (balance < 0)
    {
      // встретилась закрывающая скобка. перед ней не было открывающей.
      // тут сразу понятно, что скобки не правильно расставлены. 
      // поэтому выходим из цикла.
      break;
    }
  }
 
  return balance == 0;
}

ну или более полноая версия для тестиков

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
 
bool IsCorrect(const std::string& str)
{
  const char openBracket = '(';
  const char closeBracket = ')';
  int balance = 0;
  for (size_t i = 0, length = str.length(); i < length; ++i)
  {
    const char ch = str[i];
    if (ch == openBracket)
    {
      ++balance;
    }
    else if (ch == closeBracket)
    {
      --balance;
    }
 
    if (balance < 0)
    {
      // встретилась закрывающая скобка. перед ней не было открывающей.
      // тут сразу понятно, что скобки не правильно расставлены. 
      // поэтому выходим из цикла.
      break;
    }
  }
 
  return balance == 0;
}
 
void Check(bool isCorrect, const std::string& str)
{
  if (isCorrect == IsCorrect(str))
  {
    std::cout << "Good work for '" << str << "'" << std::endl;
  }
  else
  {
    std::cout << "Bad work for '" << str << "'" << std::endl;
  }
}
 
int main()
{
  Check(false, "()123456()(");
  Check(false, "()()()()()()()(");
  Check(false, ")()()()()()()");
  Check(true, "((()()))");
  return 0;
}
Версия от Том Ардер неверно будет работать для строки ')('. количество открывающих равно количеству закрывающих. но идут в неправильном порядке.
 
Текущее время: 14:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru