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

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

Восстановить пароль Регистрация
 
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 16:42     Проверить корректность расположения скобок #1
Код
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
#include <iostream>
#include <stack>
#include <fstream>
using namespace std;
 
int main(void)
{ 
     setlocale (0,""); 
     stack <char> S;  
     char s[] = "(())";
     int size = strlen(s); 
     for ( int i = 0; i < size; i++) 
        {
         if ( s[i] ==  '(' ) S.push ( s[i] ); 
         if (  ( s[i] ==  ')' )  &&  (S.top() == '(')  ) S.pop(); 
         else if ( S.empty() || S.top() == '('  ) 
                 {
                  cout << "bad!!!" << endl;  
                  break;
                 }
               else cout << "good!" << endl;   
              
        }
     system ("PAUSE");
Задание - проверить правильно ли расставлены скобки.
пытаюсь реализовать такой алгоритм:
1) если очередной символ "(" - помещаем в стек
2) если это ")", то проверяем, что лежит на вершине стека, если там "(" , то удаляем ее из стека
3) если стек пустой или на вершине стека "(" - заканчиваем просмотр, выражение не верное
Подскажите ошибку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
20.08.2014, 16:46     Проверить корректность расположения скобок #2
А не проще подсчитать "(" и ")" и в конце сравнить полученные числа? Или что есть "правильно расставленные скобки"?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
20.08.2014, 16:47     Проверить корректность расположения скобок #3
Зачем стек? Если скобка открывающаяся, увеличивай счётчик, если закрывающаяся - уменьшай. В конце счётчик должен быть равен 0. Ни в какой момент времени счётчик не должен быть меньше нуля.
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
20.08.2014, 17:20     Проверить корректность расположения скобок #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<char> v;
    std::string str;
    std::getline (std::cin, str);
    bool flag = true;
    for (auto i: str)
    {
        if (i=='(')
            v.push_back (i);
        else if (v.empty())
        {
            flag = false;
            break;
        }
        else
            v.pop_back();
    }
    std::cout <<(flag && v.empty() ? "Good" : "Error");
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
20.08.2014, 17:34     Проверить корректность расположения скобок #5
Работа со стеком (Необходимо проверить,правильно ли расставлены скобки)
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 18:01  [ТС]     Проверить корректность расположения скобок #6
кто - нибудь может сказать где у меня ошибка?
MicM, у тебя очень похоже,но ты через вектор сделал...

Добавлено через 37 секунд
стек нужен. такое задание
BlackIce
309 / 171 / 64
Регистрация: 18.01.2014
Сообщений: 387
20.08.2014, 18:11     Проверить корректность расположения скобок #7
Проверяет три вида скобок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stack>
#include <iostream>
 
int main() {
    std::stack<char> s;
    for (char c; std::cin >> c;) {
        switch (c) {
        case '(': case '{': case '[':
            s.push(c);
            break;
        case ')': case '}': case ']':
            if (s.empty() || (c == ')' && s.top() != '(') ||
                (c == '}' && s.top() != '{') || (c == ']' && s.top() != '[')) {
                std::cout << "no";
                return 0;
            }
            s.pop();
            break;
        }
    }
    std::cout << (s.empty() ? "yes" : "no");
}
Считаем, что "()(())()" -- это ПСП.
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 18:19  [ТС]     Проверить корректность расположения скобок #8
спасибо всем за готовые решения, но я бы хотел, что бы вы мне мою ошибку подсказали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 18:39     Проверить корректность расположения скобок
Еще ссылки по теме:

Написать программу, проверяющую корректность расположения continue в коде C++
C++ Распарсить ввод структуры, проверить на корректность
C++ Проверить корректность заданной даты

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
BlackIce
309 / 171 / 64
Регистрация: 18.01.2014
Сообщений: 387
20.08.2014, 18:39     Проверить корректность расположения скобок #9
Цитата Сообщение от arzhanok Посмотреть сообщение
что бы вы мне мою ошибку подсказали
Ваша программа рушится от простейшей тестовой строки ")", т.к. в этом случае вы пытаетесь получить (S.pop) вершину пустого стека.
Yandex
Объявления
20.08.2014, 18:39     Проверить корректность расположения скобок
Ответ Создать тему
Опции темы

Текущее время: 09:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru