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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
#1

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

20.08.2014, 16:42. Просмотров 580. Ответов 8
Метки нет (Все метки)

Код
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) если стек пустой или на вершине стека "(" - заканчиваем просмотр, выражение не верное
Подскажите ошибку
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2014, 16:42     Проверить корректность расположения скобок
Посмотрите здесь:

C++ Проверить код на корректность
C++ Проверить корректность ввода
C++ Проверить корректность ввода элементов матрицы
C++ Решение уравнения - проверить код на корректность
C++ Проверить корректность реализации нескольких задач
C++ Метод хорд - проверить корректность реализации кода
Написать программу, проверяющую корректность расположения continue в коде C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
 Аватар для quwy
3079 / 1927 / 506
Регистрация: 13.02.2013
Сообщений: 6,415
20.08.2014, 16:46     Проверить корректность расположения скобок #2
А не проще подсчитать "(" и ")" и в конце сравнить полученные числа? Или что есть "правильно расставленные скобки"?
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12526 / 7088 / 797
Регистрация: 27.09.2012
Сообщений: 17,496
Записей в блоге: 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     Проверить корректность расположения скобок
Еще ссылки по теме:

C++ Распарсить ввод структуры, проверить на корректность
C++ Проверить корректность заданной даты
C++ Нужно проверить на корректность ввода E-mail адреса
Проверить правильность расположения круглых скобок 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     Проверить корректность расположения скобок
Ответ Создать тему
Опции темы

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