Форум программистов, компьютерный форум CyberForum.ru

Скобочное выражение - C++

Восстановить пароль Регистрация
 
LTony
0 / 0 / 0
Регистрация: 23.01.2012
Сообщений: 21
10.02.2012, 16:40     Скобочное выражение #1
Помогите реализовать програмку:
Дано скобочное выражение, оканчивающееся точкой с запятой.
Само выражание программа должна запрашить у пользователя.
Проверить правильность расстановки скобок в данном выражении.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2012, 16:40     Скобочное выражение
Посмотрите здесь:

Выражение C++
C++ выражение
Выражение на С++ C++
C++ Дано скобочное выражение, оканчивающееся точкой с запятой
C++ Дано скобочное выражение, оканчивающееся точкой с запятой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.02.2012, 16:50     Скобочное выражение #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
#include <iostream>
#include <stack>
#include <string>
 
bool is_correct( const std::string& );
 
int main()
{
    std::string str;
    for ( char ch; std::cin >> ch && ch != ';'; str.push_back(ch) );
   
    std::cout << ( is_correct(str) ? "Yes" : "No" ) << std::endl;
}
 
bool is_correct( const std::string& str)
{
    std::stack< char > stack;
   
    for (int i = 0; i < (int) str.length(); ++i)
    {
        if ( str[i] == '(' || str[i] == '{' || str[i] == '[' )
        {
            stack.push( str[i] );
        }
        else
        {
           
            if ( stack.empty() ||
            (str[i] == ')' ^ stack.top() == '(' ) ||
            (str[i] == '}' ^ stack.top() == '{' ) ||
            (str[i] == ']' ^ stack.top() == '[' )   )
            {
                return false;
            }
           
            stack.pop();
        }
    }
   
    return stack.empty();
}
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
10.02.2012, 16:58     Скобочное выражение #3
C++
1
2
3
4
if ( stack.empty() ||
            (str[i] == ')' ^ stack.top() != '(' ) ||
            (str[i] == '}' ^ stack.top() != '{' ) ||
            (str[i] == ']' ^ stack.top() != '[' )   )
?
LTony
0 / 0 / 0
Регистрация: 23.01.2012
Сообщений: 21
10.02.2012, 18:25  [ТС]     Скобочное выражение #4
Цитата Сообщение от neske Посмотреть сообщение
C++
1
2
3
4
if ( stack.empty() ||
            (str[i] == ')' ^ stack.top() != '(' ) ||
            (str[i] == '}' ^ stack.top() != '{' ) ||
            (str[i] == ']' ^ stack.top() != '[' )   )
?
что то не правильно?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.02.2012, 19:11     Скобочное выражение #5
Цитата Сообщение от neske Посмотреть сообщение
C++
1
2
3
4
if ( stack.empty() ||
            (str[i] == ')' ^ stack.top() != '(' ) ||
            (str[i] == '}' ^ stack.top() != '{' ) ||
            (str[i] == ']' ^ stack.top() != '[' )   )
?
Ну если мы встретили закрывающую скобку(хотя да, я для скобочного выражения без лишних символов делал), то:
если стек пуст( нету открывающих скобок), то выражение неверное
или если тип открывающей скобки не соответствует типу закрывающей, то выражение также неверное.
Ну эту функцию я из задачи меньшикова скопипастил, вот более универсальная:
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
#include <iostream>
#include <stack>
#include <string>
 
bool is_correct( const std::string& );
 
int main()
{
    std::string str;
    for ( char ch; std::cin >> ch && ch != ';'; str.push_back(ch) );
   
    std::cout << ( is_correct(str) ? "Yes" : "No" ) << std::endl;
}
 
bool is_correct( const std::string& str)
{
    std::stack< char > stack;
   
    for (int i = 0; i < (int) str.length(); ++i)
    {
        if ( str[i] == '(' || str[i] == '{' || str[i] == '[' )
        {
            stack.push( str[i] );
        }
        else if ( str[i] == ')' || str[i] == '}' || str[i] == ']' )
        {
            if 
            ( 
                stack.empty() 
                || ( (str[i] == ')') ^ (stack.top() == '(') ) 
                || ( (str[i] == '}') ^ (stack.top() == '{') ) 
                || ( (str[i] == ']') ^ (stack.top() == '[') )   
            )
            {
                return false;
            }
           
            stack.pop();
        }
    }
   
    return stack.empty();
}
Разница в том, что учитывает, что могут встречаться другие символы кроме скобок + убрал лишние предупреждения.
Yandex
Объявления
10.02.2012, 19:11     Скобочное выражение
Ответ Создать тему
Опции темы

Текущее время: 09:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru