Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
tarasman
-26 / 0 / 0
Регистрация: 10.02.2012
Сообщений: 119
1

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

29.06.2012, 17:28. Просмотров 1304. Ответов 6
Метки нет (Все метки)

дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2012, 17:28
Ответы с готовыми решениями:

Пример Дана строка символов. Проверьте правильность расстановки в ней круглых скобок
Если скобок больше справа, то все работает(т.к условие прописано). Но вот не пойму как прописать...

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

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

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

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

6
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
29.06.2012, 18:16 2
Проверка правильности расстановки круглых скобок.
Модифицировать чуть, если не совсем немощный)
0
asidorchenko
384 / 210 / 102
Регистрация: 09.04.2012
Сообщений: 635
29.06.2012, 19:22 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

У меня получилось так, однако, как решить проблему вида [(*]) при автоматном разборе не понимаю.


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
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
/*
 
Проблема:
[(*])
 
*/
int main(int argc, char* argv[])
{
 int state, state2;
 int i;
 char* str = "([[ ([  ([([])])  [()] ]) [] ([()]) ]])\0";
 for(i = 0, state = 0, state2 = 0; str[i]!='\0'; i++)
 {
  switch(str[i])
  {
    case '(':
     switch(state)
     {
       case -1:
        break;
       default:
        if (state >= 0)
        {
         state++;
        }
        else
        {
         state = -1; 
        }       
        break;
     }         
     break; 
    case ')':
     switch(state)
     {
       case -1:
        break;
       case 0:
        state = -1;
        break;
       default:
        if (state > 0)
        {
           state--;
        }
        else
        {
         state = -1;
        }
        break;
     }
     break;
    case '[':
     switch(state2)
     {
       case -1:
        break;
       default:
        if (state2 >= 0)
        {
         state2++;
        }
        else
         state2 = -1;
        break;
     } 
     break;
    case ']':
     switch(state2)
     {
       case -1:
        break;
       case 0:
        state2 = -1;
        break;
       default:
        if (state2 > 0)
        {
          state2--;
        }
        else
         state2 = -1;
        break;
     }
     break; 
    default:
     break;  
  }
 }
  
 if (state > 0)
  printf("err: (\n");
 else if ( state == -1)
  printf("err: )\n");
 
 
 if (state2 > 0)
  printf("err: [\n");
 else if ( state2 == -1)
  printf("err: ]\n");
 
 return 0;
}
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
29.06.2012, 19:24 4
asidorchenko, классически эта задача решается стеком или его подобием.
Я мог бы посчитать количество открывающих/закрывающих скобок обоих видов с тем же успехом.
0
asidorchenko
384 / 210 / 102
Регистрация: 09.04.2012
Сообщений: 635
29.06.2012, 19:27 5
По условию задачи сказано "круглых И квадратных скобок", а не "круглых ИЛИ квадратных скобок"
0
ЛетающийЕнот
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
29.06.2012, 19:33 6
asidorchenko, и?
Если количество открывающих скобок вида не совпадает с количеством закрывающих скобок вида, то ошибка есть.

Подобный подход тоже не найдёт ошибку в ([)] и иже с ним.
0
easybudda
Модератор
Эксперт CЭксперт С++
10260 / 6148 / 1547
Регистрация: 25.07.2009
Сообщений: 11,702
29.06.2012, 20:45 7
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от ЛетающийЕнот Посмотреть сообщение
классически эта задача решается стеком или его подобием.
Полностью согласен - так проще.
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
#include <stdio.h>
#include <stdlib.h>
 
#define ROUND_OPEN '('
#define ROUND_CLOSE ')'
#define SQUARE_OPEN '['
#define SQUARE_CLOSE ']'
 
#define STR_LEN 256
#define STR_MASK "%255[^\n]%*c"
 
int test_brackets(const char * s) {
    static char stack[STR_LEN];
    int pos = -1;
    
    while ( *s ) {
        switch ( *s ) {
            case ROUND_OPEN :
            case SQUARE_OPEN :
                if ( pos >= STR_LEN - 1 )
                    return 1;
                stack[++pos] = *s;
                break;
            case ROUND_CLOSE :
                if ( pos < 0 || stack[pos--] != ROUND_OPEN )
                    return 1;
                break;
            case SQUARE_CLOSE :
                if ( pos < 0 || stack[pos--] != SQUARE_OPEN )
                    return 1;
                break;
        }
        ++s;
    }
    
    return ( pos != -1 );
}
 
int main(void) {
    char str[STR_LEN];
    
    while ( printf("String: ") && scanf(STR_MASK, str) == 1 )
        printf("%sorrect.\n", ( test_brackets(str) ) ? "Not c" : "C");
    
    return 0;
}
2
29.06.2012, 20:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2012, 20:45

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

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

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


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

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

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