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

Баланс скобок

24.04.2009, 19:44. Показов 3861. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю
Code
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXVAL 100
 
struct stack {
int sp;
int val[MAXVAL]; /* массив под скобки */
} mystack;
 
/* push: добавить элемент в стек */
void push(int c)
{
if(mystack.sp < MAXVAL)
mystack.val[mystack.sp++] = c;
else
printf("error: stack is fulled!\n");
}
 
/* pop: взять элемент из стека */
int pop(void)
{
if(mystack.sp > 0)
return mystack.val[--mystack.sp];
else
return EOF;
}
 
main()
{
FILE *fp;
int c,
marker = '!', /* маркер */
br1, br2, isbr; /* счетчики скобок */
 
mystack.sp = 0;
isbr = br1 = br2 = 0;
if( (fp = fopen("in.txt", "r")) == NULL) {
printf("error: can't open in.txt");
getch();
return 0;
}
while((c = getc(fp)) != EOF && c != marker) /* добавление скобок в стек */
if(c == '(' || c == ')') {
push(c);
isbr = 1;
}
while((c = pop()) != EOF) { /* извлечение скобок из стека */
if(c == '(')
br1++;
else if(c == ')')
br2++;
}
if(br1 != br2 && isbr != 0)
printf("\n\tUnbalanced brackets.");
else if(isbr == 0)
printf("\n\tNo brackets.");
else
printf("\n\tBalance.");
fclose(fp);
getch();
return 0;
}
эта программа проверяет баланс скобок скажите как можно сделать чтобы скобки )(-говорило что не баланс???не используя библиотеку стринг и списки..)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2009, 19:44
Ответы с готовыми решениями:

Баланс скобок
Люди может укажите мне на ошибку в программе по которой не находит баланс..? #include&lt;iostream.h&gt; #include&lt;string.h&gt; ...

Баланс скобок
проверить правильность расстановки скобок, используя контейнерные типы(стек)

Баланс скобок
Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов...

14
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.04.2009, 20:03
У тебя подход к задаче неправильный. Ты прочитал все левые и правые скобки и напихал их в стек, а потом их все оттуда достал. Т.е непонятно вообще зачем тут стек (мог бы и в обычный буффер поместить)

Правильный подход такой: в первом же цикле, где ты считываешь из файла:
1. При чтении левой скобки суёшь её в стек
2. При чтении правой скобки:
- если стек пуст, значит ошибка - лишняя (несбаллансированная) правая скобка
- достаёшь значение из стека (что там можно не смотреть, потому что суёшь ты только левые скобки).
3. По окнчании цикла проверяешь стек, если стек не пустой, значит присуствуют лишние (несбаллансированные) левые скобки

Это в том случае, если тебе поставлена задача обязательно стек использовать. Если стек не нужно, то просто используй счётчик. Для левой скобки увеличивай, для правой уменьшай. Если счётчик стал отрицательным - лишняя правая скобка. Если по окончании счётчик не равен нулю - значит есть лишние левые скобки
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 22
24.04.2009, 20:30  [ТС]
С обычым буфером все понятно прост как сделать именно для )(-что это не баланс если без стека?
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
24.04.2009, 20:36
Цитата Сообщение от влад-мармелад Посмотреть сообщение
С обычым буфером все понятно прост как сделать именно для )(-что это не баланс если без стека?
->
Цитата Сообщение от влад-мармелад Посмотреть сообщение
Если стек не нужно, то просто используй счётчик. Для левой скобки увеличивай, для правой уменьшай. Если счётчик стал отрицательным - лишняя правая скобка. Если по окончании счётчик не равен нулю - значит есть лишние левые скобки
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 22
24.04.2009, 20:37  [ТС]
так и говорю...)(-это при таком подходе будет говорить что баланс ведь есть и открывающая и закрывающая скобка..
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
24.04.2009, 20:40
внимательно читаем ,что Evg написал
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 22
24.04.2009, 23:41  [ТС]
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
while((c = getc(fp)) != EOF && c != marker)    /* добавление скобок в стек */
       if(c == '(' ){
          push(c);
          isbr1 = 1;}
 
        else if(c == ')')
        { push(c);
          isbr2=1; 
         } 
       }
while((c = pop()) != EOF) { /* извлечение скобок из стека */
if(c == '(')
br1++;
else if(c == ')')
br2++;
}
if(br1!=br2&&isbr1==br2)
printf("\n\tbracket found.");
else if(isbr2 == br1)
printf("\n\tNo brackets.");
else
printf("\n\tBalance.");
fclose(fp);
getch();
return 0;
}
мож вот так?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.04.2009, 23:42
Неправильно
У тебя в первом цикле суются в стек только левые скобки, затем у тебя идёт второй цикл, гле суются правые скобки (но цикл этот ни разу не исполнится, т.к. мы уже дошли до конца файла)

То, что я тебе писал выше, нужно делать в одном цикле
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 22
24.04.2009, 23:47  [ТС]
я тут опять немного переправил посмотри выше?не так ли?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.04.2009, 23:51
Ты написал второй вариант - во втором if'е, где else if(c == ')') надо делать pop
Т.е. при достижении левый скобки засовываем в стек (push), а при достижении правой скобки высовываем из стека (pop) то, что там лежит (зотя что там лежит, нам не важно)

Давай просто попробуем смоделировать стек звёздочками
У тебя выражение "((())())"
Начало: стек пустой
1-й символ = '(' - push, стек стал такой: *
2-й символ = '(' - push, стек стал такой: **
3-й символ = '(' - push, стек стал такой: ***
4-й символ = ')' - pop, стек стал такой: **
5-й символ = ')' - pop, стек стал такой: *
6-й символ = '(' - push, стек стал такой: **
7-й символ = ')' - pop, стек стал такой: *
8-й символ = ')' - pop, стек стал пустой
При этом неважно, что пихать в стек, я пихал туда звёздочки. Нам важно лишь состояние стека (грубо говоря, количество элементов)

Теперь неправильное выражение с избытком правых скобок: (()))
Начало: стек пустой
1-й символ = '(' - push, стек стал такой: *
2-й символ = '(' - push, стек стал такой: **
3-й символ = ')' - pop, стек стал такой: *
4-й символ = ')' - pop, стек стал пустой
5-й символ = ')' - pop, но стек уже пустой, а потому pop сделать не можем - ошибка (избыток правх скобок)

Теперь неправильное выражение с избытком левых скобок: ((())
Начало: стек пустой
1-й символ = '(' - push, стек стал такой: *
2-й символ = '(' - push, стек стал такой: **
3-й символ = '(' - push, стек стал такой: ***
4-й символ = ')' - pop, стек стал такой: **
5-й символ = ')' - pop, стек стал такой: *
Сиволы кончились, но стек у нас не пустой -ошибка (избыток левых скобок)
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 22
24.04.2009, 23:57  [ТС]
хм...а что если вставить в мою... изначальную прогу самую первую в цикл
if(br2>br1) printf("\nError");?может так легче будет?)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.04.2009, 00:02
Цитата Сообщение от влад-мармелад Посмотреть сообщение
хм...а что если вставить в мою... изначальную прогу самую первую в цикл
if(br2>br1) printf("\nError");?может так легче будет?)
В принципе, да. Но учти, что скобки из стека ты достаёшь в обратном порядке. Т.е. твоё использование стека не по назначению только усложняют порядок. Но переделать можно. Т.е. как-то нужно пространственное воображение иметь, чтобы видя скобки в обратном порядке их проверять. Тогда можешь ввобще стек не использовать. Читаешь в цикле из файла (т.е. while((c = getc(fp)) != EOF ...) но при этом дулаешь то, что у тебя записано во втором цикле (подсчёт br1 и br2)
1
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 22
25.04.2009, 00:22  [ТС]
Читаешь в цикле из файла (т.е. while((c = getc(fp)) != EOF ...) но при этом дулаешь то, что у тебя записано во втором цикле (подсчёт br1 и br2)

а можно это по подробнее объяснить?)кстати спасибо что на меня время тратишь..)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.04.2009, 00:29
Цитата Сообщение от влад-мармелад Посмотреть сообщение
а можно это по подробнее объяснить?
Сейчас у тебя сделано так. В первом цикле ты читаешь все байты и если этот байт - скобка, то ты его push в стек. Во втором цикле ты всё достаёшь из стека и при этом ведёшь подсчёт количества левых и правых скобок.

Я предлагаю сделать так. Делаешь только один цикл, в котором читаешь все байты и если этот байт - левая скобка, то делаешь подсчёт левых скобок, если правая - подсчёт правых (т.е. то, что ты делаешь во втором цикле). При этом стек тебе не нужен вообще

Цитата Сообщение от влад-мармелад Посмотреть сообщение
кстати спасибо что на меня время тратишь..)
Я не сторонник того, чтобы выкладывать на блюдечке готовое решение. У тебя вроде бы как есть желание разобраться и сделать самому, так отчего же не помочь
0
 Аватар для Gravity
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
25.04.2009, 13:32
Подправил.
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXVAL 100
 
struct stack {
    int sp;
    int val[MAXVAL];   /* массив под скобки */
} mystack;
 
/* push: добавить элемент в стек */
void push(int c)
{
    if(mystack.sp < MAXVAL)
       mystack.val[mystack.sp++] = c;
    else
       printf("error: stack is fulled!\n");
}
 
/* pop: взять элемент из стека */
int pop(void)
{
    if(mystack.sp > 0)
       return mystack.val[--mystack.sp];
    else
      return EOF;
}
 
main()
{
    FILE *fp;
    int c, 
        marker = '!',    /* маркер */
        isbr;  /* флаг наличия скобок */
    
    mystack.sp = isbr = 0;
    if( (fp = fopen("in.txt", "r")) == NULL) {
       printf("error: can't open in.txt");
       getch();
       return 0;
    }
    while((c = getc(fp)) != EOF && c != marker) {
       if(c == '(') {
          push(c);
          isbr = 1;
        }
        else if(c == ')') {
           if(mystack.sp < 1) {
              printf("\n\tUnbalanced brackets.\n");
              getch();
              fclose(fp);
              return 0;
           } else
              pop();
       }
    }     
    if(mystack.sp > 0 && isbr)
       printf("\n\tUnbalanced brackets.\n");
    else if(!isbr)
       printf("\n\tNo brackets.\n");
    else
       printf("\n\tBalance.\n");
       
    fclose(fp);
    getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.04.2009, 13:32
Помогаю со студенческими работами здесь

Баланс скобок
Помогите пожалуйста!!! Собственно задание: Текст в файле содержит многократно вложенные круглые скобки. Если баланс скобок соблюден,...

Проверить баланс скобок
:)Здравствуйте. Помогите пожалуйста с задачей. Проверить имеется ли в заданном тексте баланс открывающихся и закрывающихся скобок,...

Баланс круглых скобок
Проверить, соблюдается ли в тексте баланс круглых скобок. Для каждой открывающей скобки ‘(‘ должна быть найдена соответствующая закрывающая...

Баланс скобок в файле
#include&lt;fstream.h&gt; #include&lt;iostream.h&gt; #include&lt;string.h&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; int...

Проверять строку на баланс скобок
Драствуйте. Условие такое - написать програмку которая будет проверять строку на баланс скобок (закрытые, открытые) и чтобы текст читало с...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru