Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
arzhanok
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
1

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

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

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

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

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

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

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

8
quwy
Native x86
3344 / 2191 / 649
Регистрация: 13.02.2013
Сообщений: 7,245
20.08.2014, 16:46 2
А не проще подсчитать "(" и ")" и в конце сравнить полученные числа? Или что есть "правильно расставленные скобки"?
0
John Prick
839 / 770 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
Завершенные тесты: 3
20.08.2014, 16:47 3
Зачем стек? Если скобка открывающаяся, увеличивай счётчик, если закрывающаяся - уменьшай. В конце счётчик должен быть равен 0. Ни в какой момент времени счётчик не должен быть меньше нуля.
0
MicM
828 / 486 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
Завершенные тесты: 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");
}
1
20.08.2014, 17:20
Croessmah
++Ͻ
15869 / 8997 / 1728
Регистрация: 27.09.2012
Сообщений: 22,115
Записей в блоге: 2
Завершенные тесты: 2
20.08.2014, 17:34 5
Работа со стеком (проверить правильность расстановки скобок)
1
arzhanok
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 18:01  [ТС] 6
кто - нибудь может сказать где у меня ошибка?
MicM, у тебя очень похоже,но ты через вектор сделал...

Добавлено через 37 секунд
стек нужен. такое задание
0
BlackIce
315 / 177 / 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
arzhanok
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
20.08.2014, 18:19  [ТС] 8
спасибо всем за готовые решения, но я бы хотел, что бы вы мне мою ошибку подсказали
0
BlackIce
315 / 177 / 73
Регистрация: 18.01.2014
Сообщений: 387
20.08.2014, 18:39 9
Цитата Сообщение от arzhanok Посмотреть сообщение
что бы вы мне мою ошибку подсказали
Ваша программа рушится от простейшей тестовой строки ")", т.к. в этом случае вы пытаетесь получить (S.pop) вершину пустого стека.
1
20.08.2014, 18:39
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 18:39

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

Проверить корректность заданной даты
задана дата в пределах годах (число - от 1 до 31, месяц -от 1 до 12). Проверить корректность...

Распарсить ввод структуры, проверить на корректность
Мне нужно сделать такую вот программу &quot;С клавиатуры задается текст. Написать программу, которая...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.