Проверка правильности расстановки скобок - C++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Kateeeeeeee
Сообщения: 1
Зарегистрирован: 04 янв 2018, 15:20

04 янв 2018, 15:24

Помогите, пожалуйста, в написании счетчика скобок. Только новичок в программирование. Что-то пыталась сделать . Начало программы выглядит так. В вектор записывается выражение со скобками (например: {{a|c}f{s|g}}) и оно должно проверяться на правильность расстановки скобок.

Код: Выделить всё

#include<iostream>
#include<vector>
#include<string>

int main(){
setlocale(LC_ALL, "");
int rb = -1;
int lb = -1;
int k;
std::cout << "Введите размер:";
std::cin >> k;
std::cout << "Введите строку";
std::vector<char> myVector(k);
for (int i = 0; i < myVector.size(); i++){
std::cin >> myVector[i];
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 янв 2018, 19:38

2B OR NOT(2B) = FF
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 янв 2018, 19:41

2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

04 янв 2018, 22:26

Всё куда проще. Баланс скобок проверяется в один проход без всяких стеков. Абсурд слишком общий алгоритм линканул.

Код: Выделить всё

Целое Счётчик = 0;

Цикл по всем символам строки
{
   Если символ == '{' Тогда Увеличить(Счётчик);
   Иначе
      Если символ == '}' Тогда Уменьшить(Счётчик);

   Если Счётчик < 0 Тогда
   {
      Ошибка("Закрывающая скобка идёт раньше открывающей");
      Выйти;
   }
}

Если Счётчик <> 0 Тогда Ошибка("Нарушен баланс скобок, не хватает закрывающей скобки");
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
garmayev
Сообщения: 26
Зарегистрирован: 19 дек 2013, 17:40
Откуда: Irkutsk
Контактная информация:

13 янв 2018, 18:45

Romeo писал(а):Всё куда проще. Баланс скобок проверяется в один проход без всяких стеков. Абсурд слишком общий алгоритм линканул.

выполняется лишь баланс, а не правильность выражения

Пусть уж на основе общих примеров учат логику и принципы программирования?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

14 янв 2018, 01:28

Я не против общих подходов, но по постановке задачи, вроде как, достаточно баланса.

Меня мой первый преподаватель по основами программирования научил великолепному принципу KISS. Расшифровывается как "Keep it simple, stupid", или "Сделай это проще, дурак". Отлично разбираюсь в архитектуре, чту GOFа, Майерса, Фаулера и Кириевски. Тем не менее, пронёс этот принцип через всю свою карьеру и ни разу об этом не пожалел. Советую это и вам.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить