Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
1

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

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

Author24 — интернет-сервис помощи студентам
Код
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) если стек пустой или на вершине стека "(" - заканчиваем просмотр, выражение не верное
Подскажите ошибку
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2014, 16:42
Ответы с готовыми решениями:

Проверить корректность расстановки скобок
Дана строка текста, которая в том числе содержит множество скобок: “(”, “{”, “{aa}” – считается...

Проверить правильность расположения круглых скобок
Пусть задано множество строк. Проверить правильность расположения круглых скобок. Если скобки...

Проверить корректность расстановки скобок используя стек
Есть строка символов, признаком конца, которой является ;. В строке могут быть фигурные, круглые,...

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

8
Native x86
Эксперт Hardware
5606 / 3349 / 952
Регистрация: 13.02.2013
Сообщений: 10,619
20.08.2014, 16:46 2
А не проще подсчитать "(" и ")" и в конце сравнить полученные числа? Или что есть "правильно расставленные скобки"?
0
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,395
20.08.2014, 16:47 3
Зачем стек? Если скобка открывающаяся, увеличивай счётчик, если закрывающаяся - уменьшай. В конце счётчик должен быть равен 0. Ни в какой момент времени счётчик не должен быть меньше нуля.
0
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
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");
}
1
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
20.08.2014, 17:34 5
Работа со стеком (проверить правильность расстановки скобок)
1
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 18:01  [ТС] 6
кто - нибудь может сказать где у меня ошибка?
MicM, у тебя очень похоже,но ты через вектор сделал...

Добавлено через 37 секунд
стек нужен. такое задание
0
317 / 179 / 73
Регистрация: 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");
}
Считаем, что "()(())()" -- это ПСП.
1
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 18:19  [ТС] 8
спасибо всем за готовые решения, но я бы хотел, что бы вы мне мою ошибку подсказали
0
317 / 179 / 73
Регистрация: 18.01.2014
Сообщений: 387
20.08.2014, 18:39 9
Цитата Сообщение от arzhanok Посмотреть сообщение
что бы вы мне мою ошибку подсказали
Ваша программа рушится от простейшей тестовой строки ")", т.к. в этом случае вы пытаетесь получить (S.pop) вершину пустого стека.
1
20.08.2014, 18:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2014, 18:39
Помогаю со студенческими работами здесь

Собственный конфиг файл. Парсинг. Корректность фигурных скобок. Секции и группы
Всем доброго утра. Файл разделен на секции вида: Имя подсекции,секции может быть любым,в примере...

Авто-расположения скобок в visual studio
Сейчас, при нажатии Enter, это выглядит так: int parser(){ } а нужно: int parser() {

Проверить код на корректность
Сделал лабу, все работает отлично.... Но я не уверен что она написана нормально, может где то...

Проверить корректность ввода
Постройте функции для запроса и чтения ФИО, почтового адреса и даты, и проверьте корректность ввода.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru