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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Twixik
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 2
#1

Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? - C++

13.02.2014, 12:48. Просмотров 952. Ответов 7
Метки нет (Все метки)

Здравствуйте. Прошу помощи в решение задачи.

Дана конечная последовательность, состоящая из левых и правых скобок pазличных заданных типов( «(» «{» «[»«)» «}» «]»). Определить, можно ли добавить в нее цифры и знаки арифметических действий так, чтобы получилось правильное арифметическое выражение.

Просьба написать код
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 12:48     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение?
Посмотрите здесь:

Нужно расставить между числами знаки + или - таким образом, чтобы получилось выражение, значение которого равно s и вывести его на экран C++
C++ В данном натуральном числе переставить цифры таким образом, чтобы получилось наименьшее число записанное этими же цифрами
Выяснить, можно ли добавить в последовательность цифры и знаки арифметических действий C++
Отредактировать текст таким образом, чтобы все знаки препинания располагались в начале, за ним следовали цифры C++
Сколько нужно убрать из данной последовательности скобок, чтобы получить правильную последовательность? C++
C++ Переставить цифры местами так, чтобы получилось большее число
C++ Можно ли получить из последовательности скобок корректное арифметическое выражение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Eldies
89 / 80 / 28
Регистрация: 06.02.2014
Сообщений: 119
13.02.2014, 17:14     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #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
#include <string>
#include <stack>
 
bool checkString(std::string str)
{
    std::stack<char> sta; 
    for(int i = 0; i < str.length(); ++i)
    {
        if ((str[i] =='(') || (str[i] =='{') || (str[i] =='['))
            sta.push(str[i]); // если открывающая скобка - помещаем ее в стек
        else
        { // если не открывающая 
            if (sta.size() == 0)
                return false; // если стек пуст, значит скобочная последовательность неправильная.
            char c = sta.top(); // берем последнюю открывающую скобку
            sta.pop();
 
            if ((c == '(' && str[i] != ')') ||  // если тип последней открывающей скобки 
                (c == '{' && str[i] != '}') ||  // не совпадает с текущей закрывающей скобкой - 
                (c == '[' && str[i] != ']'))    // - скобочная последовательность неправильная
                return false; 
        }
    }
    return (sta.size() == 0);   // если после обработки строки, остались 
                        // незакрытые скобки, скобочная последовательность неправильная
}
Twixik
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 2
13.02.2014, 20:08  [ТС]     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #3
Спасибо большое
Alex_244
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 76
03.01.2016, 16:57     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #4
В продолжение темы. Попытался переделать этот код без использования STL, но почему то не работает, исправьте пожалуйста, ошибки.
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
struct stack
{
    int x;
    stack *next;
} *top, *cur;
 
void push(int i, char *str1)
{
    top = new stack;
    top->next = NULL;
    cur = top;
    cur = new stack;
    cur->x = str1[i];
    cur->next = top;
    top = cur;
}
int ControlOfThesis(char *str)
{
    for (int i = 0; i < strlen(str); i++)
    {
        if ((str[i] == '(') || (str[i] == '{') || (str[i] == '['))
 
            push(i, str);
 
        else{
            stack *temp = top;
            if (temp->next) return 0;
            char t = top->x;
            delete temp;
 
            if ((t == '(' && str[i] != ')') ||  // если тип последней открывающей скобки 
                (t == '{' && str[i] != '}') ||  // не совпадает с текущей закрывающей скобкой 
                (t == '[' && str[i] != ']'))    // значит скобки в неправильном порядке
                return 0;
 
        }
 
 
    }
    return 1;
}
 
int main()
{
    char *str = "({[]})";
    if (ControlOfThesis(str)) cout << "YES\n";
    else cout << "NO!\n";
    system("pause");
    return 0;
 
}
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
03.01.2016, 19:47     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #5
Вообще-то в арифметических выражениях нельзя вставлять старшие скобки внутрь младших.
В этом случае как-то так:
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>
#include <stack>
///////////////////////////////////////////////////////////////////////////////
typedef std::string             T_str;
typedef std::stack  < char  >   T_symb_stack;
///////////////////////////////////////////////////////////////////////////////
bool        great_bracket
    (
        char    L,
        char    R
    )
{
    T_str   res_str;
    res_str.push_back(L);
    res_str.push_back(R);
 
    return      res_str     ==  "{["
            ||  res_str     ==  "{("
            ||  res_str     ==  "[("
 
            ||  res_str     ==  " {"
            ||  res_str     ==  " ["
            ||  res_str     ==  " (";
}
///////////////////////////////////////////////////////////////////////////////
bool    eq_bracket
    (
        char    L,
        char    R
    )
{
    T_str   res_str;
    res_str.push_back(L);
    res_str.push_back(R);
 
    return      res_str     ==  "{}"
            ||  res_str     ==  "[]"
            ||  res_str     ==  "()";
}
///////////////////////////////////////////////////////////////////////////////
bool    brackets_are_correct( T_str     const   &   s )
{
    char    static  const   SPACE   =   ' ';
    T_symb_stack            symb_stack;
 
    symb_stack.push( SPACE );
 
    for     (
                auto    symb
                :
                s
            )
    {
        if  (
                great_bracket
                    (
                        symb_stack.top(),
                        symb
                    )
            )
        {
            symb_stack.push( symb );
        }
        else if     (
                        eq_bracket
                            (
                                 symb_stack.top(),
                                 symb
                            )
                    )
        {
            symb_stack.pop();
        }
        else
        {
            return  false;
        }
    }//for
 
    return      symb_stack.top  ()  ==  SPACE
            &&  symb_stack.size ()  ==  1;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    srand(unsigned(time(0)));
    T_str   brackets    =   "{}[]()";
 
    for(;;)
    {
        auto    str_len     =   rand() % 6 + 9;
        T_str   s( str_len, 0 );
 
        std::generate
            (
                s.begin     (),
                s.end       (),
 
                [=]
                {
                    return  brackets
                                [
                                    rand() % brackets.size()
                                ];
                }
            );
 
        if  (
                brackets_are_correct( s )
            )
        {
            std::cout   <<  s
                        <<  std::endl;
 
            system("pause");
        }
    }//for
}
Alex_244
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 76
03.01.2016, 19:59     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #6
Да тут не суть какие скобки, старшие или младшие, просто суть в том, что они разные, это во-первых. А во-вторых, как раз таки я спросил без STL (
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
03.01.2016, 20:28     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #7
Цитата Сообщение от Alex_244 Посмотреть сообщение
я спросил без STL (
Ну, это вы разделом ошиблись, вам к сишникам надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2016, 20:39     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение?
Еще ссылки по теме:

C++ Переставить цифры числа так, чтобы получилось минимальное возможное число
C++ Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом
C++ В выражении расставить знаки арифметических операций, чтобы получилось заданное число
C++ Расставить знаки между цифрами так, чтобы получилось заданное число
Правильное арифметическое выражение со скобками C++

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

Или воспользуйтесь поиском по форуму:
Alex_244
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 76
03.01.2016, 20:39     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? #8
Окей, создам новую тему
Yandex
Объявления
03.01.2016, 20:39     Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение?
Ответ Создать тему
Опции темы

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