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

Работа со стеком (проверить правильность расстановки скобок)

29.03.2013, 09:01. Показов 19430. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано математическое выражение, к примеру {x+(g-[f+h]*c)-(q+w)}.
Необходимо проверить,правильно ли расставлены скобки. Проверять следует следующим образом:если встретилась левая скобка,помещаем ее в стек. если правая,то сравниваем ее в верхним элементом стека,если скобки соответствуют, то удаляем ее из стека. Код написала,но в нем много синтаксических ошибок(первый раз работаю со стеком),не могу разобраться(((
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 <vcl.h>
#pragma hdrstop
#include <string.h>
#include <stdio.h>
#include <stack.h>
#pragma argsused
int main()
{
string s;
stack <string> st;
s="{x+(g-[f+h]*c)-(q+w)}";
printf("%s", s); // пыталась вывести строку на экран,но чего то не работает
for (int i=1;i<=s.size() ;i++)
{
if (s.substr(i,1)=="{" || s.substr(i,1)=="[" || s.substr(i,1)=="(")
st.push(s.substr(i,1));
if (s.substr(i,1)=="}" || s.substr(i,1)=="]" || s.substr(i,1)==")")
st.pop(s.substr(i,1));
}
if (st.empty()) printf("good");
else  printf("gbad");
getchar();
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2013, 09:01
Ответы с готовыми решениями:

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

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

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

9
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
29.03.2013, 09:29
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
#include "MTL_Stack.h"
#include <string>
#include <iostream>
#include <iomanip>
 
bool foo(std::string & sourcestr){
    std::string openstr="([{";
    std::string closestr=")]}";
    std::string::size_type pos_offset=0;
    MTL::Stack<std::string::size_type> st;
    for(std::string::iterator it=sourcestr.begin();it!=sourcestr.end();++it){
        if ((pos_offset=openstr.find(*it,0))!=std::string::npos){
            st.push(pos_offset);
        }else{
            if((pos_offset=closestr.find(*it,0))!=std::string::npos){
                if(st.empty()){
                    return false;
                }
                if(pos_offset==st.top()){
                    //Совпадение
                    st.pop();
                }else{
                    //Ожидается другая скобка
                    return false;
                }
            }
        }
    }
    return st.empty();
}
 
 
 
int main(){
    std::string sourcestr="[(2+2)*2+((2+4)+6)-[({}{}){}]]";
    std::cout<<std::boolalpha<<foo(sourcestr)<<std::endl;
}
MTL::Stack поменяйте на stack из STL
5
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
29.03.2013, 09:43  [ТС]
большое спасибо))
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
29.03.2013, 09:43
Мне не очень нравится вариант с постоянным поиском подстроки. С учетом не слишком большого числа скобок, можно сделать отдельные вычисления или даже заинлайнить.
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
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <string>
#include <stack>
 
bool isOpenBracket(char symbol) {
  return symbol == '(' || symbol == '{' || symbol == '[';
}
 
bool isClosingBracket(char symbol) {
  return symbol == ')' || symbol == '}' || symbol == ']';
}
 
char getOpenBracketPair(char bracket) {
  return (bracket == '}') ? '{' : (bracket == ')') ? '(' :
    (bracket == ']') ? '[' : '\0';
}
 
bool areParenthesesGood(const std::string &source) {
  std::stack<char> stack;
  for (size_t i = 0; i < source.size(); ++i) {
    if (isOpenBracket(source[i])) {
      stack.push(source[i]);
    } else {
      if (isClosingBracket(source[i])) {
        char openBracket = getOpenBracketPair(source[i]);
        if (!stack.empty() && stack.top() == openBracket) {
          stack.pop();
        } else {
          return false;
        }
      }
    }
  }
  return stack.empty();
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  std::string expression = "{x+(g-[f+h]*c)-(q+w)}";
  std::cout << areParenthesesGood(expression) << std::endl;
  
  std::cin.get();
  return 0;
}
5
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
31.03.2013, 11:36  [ТС]
спасибо)
0
31.03.2013, 20:07

Не по теме:

Цитата Сообщение от lemegeton Посмотреть сообщение
Мне не очень нравится вариант с постоянным поиском подстроки.
Ну как бы тогда достаточно в одном месте исправить искомые строки, например добавить еще какую-нибудь скобку для поиска, или удалить, а то и вообще передавать искомые скобки в функцию в качестве параметра

0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
29.03.2017, 00:58
как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
bool isPosl(std::string& some)
{
    int brackets = 0;
    return (std::find_if(some.begin(), some.end(), [&brackets](char ch)
    {
        brackets += (ch == '(');
        brackets -= ((ch == ')') && (brackets > 0));
 
        return brackets == 0;
    }) != some.end()) ? true : false;
}
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
29.06.2017, 13:36
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
 
int main() {
    
    std::string s = "[(2+2)*2+(2+4)+6)-[({}{}){}]]";
    
    int brackets = 0;
    for (char ch : s) {
        brackets += (ch == '(' || ch == '[' || ch == '{');
        brackets -= (ch == ')' || ch == ']' || ch == '}');
    }
    
    (brackets == 0) ? std::cout << "well" : std::cout << "ugly";
    
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18149 / 10733 / 2067
Регистрация: 27.09.2012
Сообщений: 27,031
Записей в блоге: 1
29.06.2017, 20:12
zarko97, std::string s = "[)"; - получаем облом.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
16.07.2017, 18:47
Croessmah,
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
#include <iostream>
#include <string>
#include <map>
#include <stack>
 
std::map<char, char> brackets = {
    {')', '('},
    {'}', '{'},
    {']', '['}
};
 
inline bool open_brackets(char ch) {
    return ch == '(' || ch == '{' || ch == '[';
}
 
inline bool close_brackets(char ch) {
    return ch == ')' || ch == '}' || ch == ']';
}
 
bool good_sequence(std::string& str) 
{
    std::stack<char> st;
    for (auto ch : str) {
        if (open_brackets(ch)) st.push(ch);
        else if (close_brackets(ch)) {
            if (!st.empty() && st.top() == brackets[ch]) 
                st.pop();
            else 
                return false;
        }
    }
    return st.empty();
}
 
int main()
{
    std::string s = "([]))";
    (good_sequence(s)) ? std::cout << "yes" : std::cout << "no";
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2017, 18:47
Помогаю со студенческими работами здесь

Проверить правильность расстановки в тексте круглых скобок
Задача: Проверить правильность расстановки в тексте круглых скобок. #include &lt;iostream&gt; #include &lt;cstring&gt; using...

В символьной строке проверить правильность расстановки скобок
Есть строка, нужно проверить её на правильное раставление скобок. Как это организовать правильно?

Проверить в тексте файла правильность расстановки открывающих и закрывающих скобок
Помогите, пожалуйста написать программу C++ Дан текстовый файл INPUT.TXT. Проверить в тексте файла правильности расстановки открывающих и...

Проверить правильность расстановки и вложенности скобок в тексте (абстрактный стек)
реализовать с помощью связного списка...

Проверить правильность расстановки в тексте круглых скобок (конечный автомат)
Только начала изучать С++.Необходимо проверить правильность расстановки в тексте круглых скобок. Текст вводится с клавиатуры и...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru