Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
emacs
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 3
1

Проверить правильность скобочной структуры, составленной из нескольких типов скобок

18.11.2012, 12:31. Просмотров 1879. Ответов 5
Метки нет (Все метки)

Я пока в процессе изучение Си и поэтому уделяю большое время на задачи что бы во много разобратся
тут попалась вот такая задача:

Напишите программу, которая проверяет правильность скобочной структуры, составленной из нескольких типов скобок (круглых, квадратных и фигурных).Например, ({()[]}) — правильная структура, а ({()[)}] — неправильная.

собственно я во так приблизительно понял и решил её
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 int main (void)
 {
     int ch, a=0;
     printf ("Введите правильные скобки ");
     do {
         ch = getchar();
         if( ch == '({()' ) a++;
         else if( ch == '[]})' ) if(--a < 0) break;
     } while(ch != '\n');
     if( a == 0) printf ("Правильно\n");
     else printf ("Не правильно\n");
     return 0;
 }
скажите это правильно? Если нет то могли бы меня просто направить на правельный путь.

Спасибо за внимание и потраченое время.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2012, 12:31
Ответы с готовыми решениями:

Проверить правильность расстановки скобок
Не знаю в чем ошибка, программа не работает. Подскажите пожалуйста)) /*...

Проверить правильность расстановки скобок и выражений
Дано скобочное выражение, оканчивающееся точкой с запятой. Проверить...

Проверить правильность расстановки скобок в строке
прошу помочь доделать задачу:Задан текст, в котором присутствующие скобки....

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

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

5
NoMasters
Псевдослучайный
1912 / 1123 / 90
Регистрация: 13.09.2011
Сообщений: 3,181
18.11.2012, 15:45 2
Во-первых проверить, входит ли символ в набор таким образом не получится, во-вторых нужно проверять совпадение типа закрывающей скобки с предыдущей незакрытой открывающей.
0
Nameless One
Эксперт С++
5789 / 3438 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
19.11.2012, 04:39 3
Цитата Сообщение от emacs Посмотреть сообщение
скажите это правильно?
Все неправильно, и алгоритм, и реализация. Прочитай про представление строк в C, их отличие от символов, про строковые и символьные литералы и про то, как сравниваются строки в C.

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

Если по достижении конца входных данных стек не пуст - скобки расставлены неправильно.

На форуме куча решений этой задачи, используй поиск.
0
UriahHeep
222 / 217 / 77
Регистрация: 24.09.2012
Сообщений: 511
Записей в блоге: 2
19.11.2012, 17:23 4
Цитата Сообщение от Nameless One Посмотреть сообщение
Для случая с различными типами скобок можно использовать стек.
Согласен.
Помнится такое задание в K&R. Реализовал тогда это на переменных: встречаем открывающую скобку делаем ++, встречаем закрывающую, делаем --. Разные переменные для разных скобок. В конце переменные должны быть равны нулю. Если нет, то знаем с какими скобками проблемы.

Но и мой и ваш, Nameless One, способы не подойдут в данном случае.
Цитата Сообщение от emacs Посмотреть сообщение
({()[)}] — неправильная
в этой последовательности все скобки парные и условие
Цитата Сообщение от Nameless One Посмотреть сообщение
Если тип закрывающей скобки отличается от типа открывающей скобки, лежащей на вершине стека, то скобки расставлены неправильно.
вылетит на второй закрывающей круглой скобке.
1
Nameless One
Эксперт С++
5789 / 3438 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
19.11.2012, 17:43 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от newsrc Посмотреть сообщение
Но и мой и ваш, Nameless One, способы не подойдут в данном случае.
Цитата Сообщение от emacs Посмотреть сообщение
({()[)}] — неправильная
в этой последовательности все скобки парные и условие
Цитата Сообщение от Nameless One Посмотреть сообщение
Если тип закрывающей скобки отличается от типа открывающей скобки, лежащей на вершине стека, то скобки расставлены неправильно.
вылетит на второй закрывающей круглой скобке.
Мой способ прекрасно подойдет, а вот этот уже нет:

Цитата Сообщение от newsrc Посмотреть сообщение
Реализовал тогда это на переменных: встречаем открывающую скобку делаем ++, встречаем закрывающую, делаем --. Разные переменные для разных скобок. В конце переменные должны быть равны нулю.
Почему? Потому, что стек, в отличие от переменных для каждого типа скобок, позволяет не только отслеживать соотношение открывающих/закрывающих скобок одного типа, но также и порядок появления скобок разных типов.

Объясню на этих же примерах (запись вида <a, b, c> будет обозначать стек с элементами a, b и c, причем вершина стека будет располагаться слева, т.е. на вершине стека находится элемент a):
  1. Пример с правильной расстановкой скобок: ({()[]}). Ход работы алгоритма:
    • Символ '(' (открывающая скобка). Кладем в стек: <(>
    • Символ '{'. Кладем в стек: <{, (>
    • Символ '('. Кладем в стек: <(, {, (>
    • Символ ')' (закрывающая скобка). Проверяем скобку на вершине стека. Типы скобок совпадают (круглые скобки), выталкиваем один элемент из стека: <{, (>
    • Символ '['. Кладем в стек: <[, {, (>
    • Символ ']'. Проверяем скобку на вершине стека. Типы скобок совпадают, (квадратные скобки), выталкиваем один элемент из стека: <{, (>
    • Символ '}'. Бла-бла-бла, выталкиваем один элемент из стека: <(>
    • Символ ')'. Бла-бла-бла, выталкиваем элемент из стека: <>
    • Символы кончились, проверяем, пуст ли стек? Стек пуст, а это значит, что конструкция правильная
  2. Пример с неправильной расстановкой скобок: ({()[)}]. Перейдем сразу же к состоянию, когда встретилась первая закрывающая скобка (стек: <(, {, (>):
    • Символ ')', Бла-бла-бла, выталкиваем один элемент из стека: <{, (>
    • Символ '[', кладем в стек: <[, {, (>
    • Символ ')', круглая закрывающая скобка. А на вершине стека у нас квадратная открывающая скобка '['. Типы не совпадают, приходим к правилу:
      Цитата Сообщение от Nameless One Посмотреть сообщение
      Если тип закрывающей скобки отличается от типа открывающей скобки, лежащей на вершине стека, то скобки расставлены неправильно.
      Т.е., корректно распознаем неправильную скобочную конструкцию.

И ничего не ломается.
4
UriahHeep
222 / 217 / 77
Регистрация: 24.09.2012
Сообщений: 511
Записей в блоге: 2
19.11.2012, 18:08 6
Nameless One, алгоритм работы можно было и не описывать. Извиняюсь, решил, что та самая неправильная последовательность тоже должна проходить.
0
19.11.2012, 18:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 18:08

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

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

Проанализировать правильность расставленных скобок
не компилирует #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() { ...


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

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

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