Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/88: Рейтинг темы: голосов - 88, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 28

Проверка расстановки скобок

05.12.2018, 17:21. Показов 16221. Ответов 2

Студворк — интернет-сервис помощи студентам
Проверить правильность расстановки скобок, используя класс стек. Программа работает не во всех случаях.
Например, если вводить { ( } ). то будет выводиться, что скобки расставлены правильно. Как это исправить?

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <Windows.h>
using namespace std;
 
class List
{
protected:
    char ch;
    List * next;
public:
    void set(char c, List* n_c)
    {
        ch = c;
        next = n_c;
    }
    char info_ch()
    {
        return ch;
    }
    List * info_next()
    {
        return next;
    }
};
class Stack : public List
{
private:
    List* pres;
public:
    Stack()
    {
        pres = NULL;
    }
    bool st_empty()//Проверка на пустоту
    {
        return pres == NULL;
    }
    void push(char ch) //Добавление нового элемента
    {
        List* next_ch = new List;
        next_ch->set(ch, pres);
        pres = next_ch;
    }
    char peek() //Считывание головного элемента
    {
        if (!st_empty())
            return pres->info_ch();
    }
    void pop() //Удаление головного элемента
    {
        if (!st_empty())
        {
            List* past = pres->info_next();
            delete pres;
            pres = past;
        }
    }
    void zadacha(Stack S)
    {
        int s1 = 0, s2 = 0, s3 = 0;
        bool t = true;
        char ch;
        while (t && !S.st_empty())
        {
            ch = S.peek();
            switch (ch)
            {
            case '(':--s1; break;
            case ')':++s1; break;
            case '{':--s2; break;
            case '}':++s2; break;
            case '[':--s3; break;
            case ']':++s3; break;
            default:break;
            }
            if (s1 >= 0 && s2 >= 0 && s3 >= 0)
                t = true;
            else
                t = false;
            S.pop();
        }
        if (t && s1 == 0 && s2 == 0 && s3 == 0)
            cout << "Скобки в этой строке расставлены правильно" << endl;
        else
            cout << "Скобки в этой строке расставлены неправильно" << endl;
        }
};
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char ch;
    Stack c;
    cout << "Введите строку" << endl;
    cin >> ch;
    while (ch != '.')
    {
        c.push(ch);
        cin >> ch;
    }
    c.zadacha(c);
    system("PAUSE");
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.12.2018, 17:21
Ответы с готовыми решениями:

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

Проверка правильности расстановки скобок в строке
Проверка строки на правильность написания То есть (5-6)*(5-6) правильно )5-6(*(5-6) неправильно

Проверка правильности расстановки скобок в строке (рекурсия)
Помогите написать рекурсивную функцию, проверяющую правильность расстановки скобок в строке. Правильные скобочные структуры: () ({}) ...

2
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
05.12.2018, 18:26
Лучший ответ Сообщение было отмечено dadessm как решение

Решение

1. Намудрили с наследованием. Не нужно оно здесь.
2. Прикладная zadacha() не должна быть членом класса стек. Чисто по логике.
3. На предупреждения компилятора надо реагировать. peek() в случае пустого стека всё-таки должен что-то возвращать.
4. Поскольку Stack при своей работе работает с памятью из кучи, необходим деструктор, который вернёт в кучу занятую память.
5. Вы несколько в лоб восприняли условие, что при контроле баланса скобок нужно использовать стек. Всю строку совершенно не нужно засовывать в стек, а потом работать со стеком, как со строкой.

Вот такая штука работает:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
 
class List {
protected:
    char ch;
    List * next;
public:
    void set(char c, List* n_c) {
        ch = c;
        next = n_c;
    }
    char info_ch() {
        return ch;
    }
    List * info_next() {
        return next;
    }
};
class Stack {
private:
    List* pres;
public:
    Stack() {
        pres = NULL;
    }
    ~Stack() {
        while (pres)
            pop();
    }
    bool st_empty()//Проверка на пустоту
    {
        return pres == NULL;
    }
    void push(char ch) //Добавление нового элемента
    {
        List* next_ch = new List;
        next_ch->set(ch, pres);
        pres = next_ch;
    }
    char peek() //Считывание головного элемента
    {
        if (!st_empty())
            return pres->info_ch();
        return '\0';
    }
    void pop() //Удаление головного элемента
    {
        if (!st_empty()) {
            List* past = pres->info_next();
            delete pres;
            pres = past;
        }
    }
    ostream & dump(ostream & os) {
        List *tmp = pres;
        while (tmp) {
            os << tmp->info_ch();
            tmp = tmp->info_next();
        }
        return os;
    }
};
 
bool zadacha(const string & str) {
 
    Stack st;
    char ch;
    char bracket;
    for (size_t i = 0; i < str.size(); ++i) {
        ch = str[i];
        switch (ch) {
        case '(':
        case '{':
        case '[':
            st.push(ch);
            st.dump(cout) << endl;
            break;
 
        case ')':
        case '}':
        case ']':
            if (st.st_empty())
                return false;
            bracket = st.peek();
            switch (bracket) {
            case '(': bracket = ')'; break;
            case '{': bracket = '}'; break;
            case '[': bracket = ']'; break;
            }
            if (bracket != ch)
                return false;
            st.pop();
            st.dump(cout) << endl;
            break;
        default:break;
        }
    }
    return st.st_empty() ? true : false;
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string str;
    cout << "Введите строку" << endl;
    getline(cin, str);
    cout << (zadacha(str) ? "Скобки в этой строке расставлены правильно" :
             "Скобки в этой строке расставлены неправильно") << endl;
    //system("PAUSE");
}
2
-1 / 1 / 1
Регистрация: 14.01.2017
Сообщений: 322
04.05.2020, 15:25
L0M, Здравствуйте
Может быть сможете помочь мне нужен двусвязный список
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2020, 15:25
Помогаю со студенческими работами здесь

Верность расстановки скобок
Добрый вечер! Имеется задание: проверить верность расстановки скобок. Необходимо проверить верность расстановки + ко всему добавить в...

Правильность расстановки скобок
Всё обыскал но никак не могу найти именно то, что мне нужно, а именно: Со всем в принципе разобрался, только вот с ошибочными...

Проверить правильность расстановки скобок
Помогите написать программу на c++. Дана строка, содержащая латинские буквы и скобки трех видов: «()», «», «{}». Если скобки расставлены...

Проверить правильность расстановки скобок в файле
Всем привет. У меня есть часть программы, которая выводит содержимое файла. Как мне проверить правильность расстановки скобок в этом файле....

Работа со стеком (проверить правильность расстановки скобок)
Дано математическое выражение, к примеру ((a+b)*b(s)() Необходимо проверить,правильно ли расставлены скобки. Проверять следует следующим...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru