Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Обратная польская запись (ОПЗ). Учет приоритета операций

07.07.2018, 15:46. Показов 8357. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Сегодня на курсах писали решение для задачи (см. ссылку на задачу), но, кажется, забыли, учесть приоритет операций (скобки в этой задаче отсутствуют по условию). Проблема всего в двух тестах (пишет неправильный ответ ) и скорее всего это приоритет. Может кто-то знает (уже сдавал эту задачу) как легко исправить данную ошибку или алгоритм переделывать придется И дело ли в этом вообще...непонятно. А так программа работает.

Вот код:

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
#include <bits/stdc++.h>
 
    using namespace std;
 
int main() {
    int a, b;
    bool flag = false;
    stack<int> st;
    string s, ex;
    getline(cin, s);
    stringstream str(s);
    while (str >> ex) {
        if (!(ex == "-" || ex == "+" || ex == "*" || ex == "/")) st.push(atoi(exp.c_str()));
        else {
            if (!st.empty()) {
                b = st.top();
                st.pop();
            } else {
                flag = true;
                break;
            }
            if (!st.empty()) {
                a = st.top();
                st.pop();
            } else {
                flag = true;
                break;
            }
            switch (ex[0]) {
            case '+':
                st.push(a + b);
                break;
            case '-':
                st.push(a - b);
                break;
            case '*':
                st.push(a * b);
                break;
            case '/':
                if (b != 0) st.push(a / b);
                else {
                    cout << "ERROR\n";
                    return 0;
                }
                break;
            }
        }
    }
    if (!st.empty() && !flag) {
        int c = st.top();
        st.pop();
        if (st.empty()) {
            cout << c << "\n";
        } else {
            cout << "ERROR\n";
        }
    } else {
        cout << "ERROR\n";
    }
    system("pause");
    return 0;
}
Ссылка на задачу: https://informatics.msk.ru/mod... rid=112494
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2018, 15:46
Ответы с готовыми решениями:

Обратная польская запись (ОПЗ)
Пожалуйста помогите!!!! не знаю что мне сделать с этими задачами=((((( A. Обратная польская запись (ОПЗ). Постфиксной формой записи...

Обратная польская запись
Доброго времени суток. Нужно сделать программу которая переводит арифм. выражение в обратную польскую запись и считает его по ней. ...

Обратная польская запись
Пожалуйста помогите, всю голову себе сломал. Задание: &quot;Обеспечить перевод инфиксного выражения в ОПЗ и вычислить его результат. Входные...

38
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 16:34
Когда то по древней книжке Дейтелов решал. Интерфейс по работе со стеком поправьте на стандартный.

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
#include <iostream>
 
using namespace std;
 
int errorDivision = 0;
 
int evaluatePostfixExpression(const char[]);
int isOperator(char);
int calculate(int, int, char);
 
int main()
{
    char postfix[256];
    int rezult;
 
    cout << endl
        << "Input postfix expression:"
        << endl;
    cin.getline(postfix, 256, '\n');
    rezult = evaluatePostfixExpression(postfix);
 
    if (!errorDivision)
        cout << endl << "Result: " << rezult << endl;
    else
        cout << endl << "Error: division by zero!" << endl;
 
    system("pause");
    return 0;
}
 
int evaluatePostfixExpression(const char postfix[])
{
    Stack<int> stack;
    int x, y;
 
    for (int i = 0; postfix[i] != '\0'; i++)
    {
        if (postfix[i] >= '0' && postfix[i] <= '9')
            push(stack, postfix[i] - '0');
        else if (isOperator(postfix[i]))
        {
            x = pop(stack);
            y = pop(stack);
            push(stack, calculate(y, x, postfix[i]));
        }
    }
 
    return pop(stack);
}
 
int isOperator(char c)
{
    if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%')
        return 1;
    else
        return 0;
}
 
int calculate(int op1, int op2, char operat)
{
    int rezult;
 
    switch (operat)
    {
    case '+':
 
        rezult = op1 + op2;
        break;
 
    case '-':
 
        rezult = op1 - op2;
        break;
 
    case '*':
 
        rezult = op1 * op2;
        break;
 
    case '/':
 
        if (op2 != 0)
            rezult = op1 / op2;
        else
        {
            rezult = 0;
            errorDivision = 1;
        }
 
        break;
 
    case '^':
 
        rezult = 1;
 
        for (int i = 0; i < op2; i++)
            rezult *= op1;
 
        break;
 
    case '%':
 
        rezult = op1 % op2;
        break;
    }
 
    return rezult;
}
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 16:59  [ТС]
QuakerRUS, переделал ваш код для сдачи. Но здесь, также, не учтен приоритет операций. Например, 2 2 + 2 * выдаст 8, а должно быть шесть. И случай с ERROR здесь не учтен Вот код:

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
#include <bits/stdc++.h>
 
    using namespace std;
    
int errorDivision = 0;
 
int evaluatePostfixExpression(const char[]);
int isOperator(char);
int calculate(int, int, char);
 
int main() {
    char postfix[256];
    int result;
    cin.getline(postfix, 256, '\n');
    result = evaluatePostfixExpression(postfix);
    if (!errorDivision)
        cout << result << "\n";
    else
        cout << "ERROR\n";
    system("pause");
    return 0;
}
 
int evaluatePostfixExpression(const char postfix[]) {
    stack<int> stack;
    int x, y;
 
    for (int i = 0; postfix[i] != '\0'; i++) {
        if (postfix[i] >= '0' && postfix[i] <= '9')
            stack.push(postfix[i] - '0');
        else if (isOperator(postfix[i])) {
            x = stack.top();
            stack.pop();
            y = stack.top();
            stack.pop();
            stack.push(calculate(y, x, postfix[i]));
        }
    }
 
    return stack.top();
}
 
int isOperator(char c) {
    if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%')
        return 1;
    else
        return 0;
}
 
int calculate(int op1, int op2, char operat) {
    int result;
 
    switch (operat) {
    case '+':
        result = op1 + op2;
        break;
    case '-':
        result = op1 - op2;
        break;
    case '*':
        result = op1 * op2;
        break;
    case '/':
        if (op2 != 0)
            result = op1 / op2;
        else {
            result = 0;
            errorDivision = 1;
        }
        break;
    case '^':
        result = 1;
        for (int i = 0; i < op2; i++)
            result *= op1;
        break;
    case '%':
        result = op1 % op2;
        break;
    }
    return result;
}
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 17:04
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Но здесь, также, не учтен приоритет операций. Например, 2 2 + 2 * выдаст 8, а должно быть шесть.
2 2 + 2 * должно дать ответ 8, так как эта постфиксная запись получена с инфиксной (2 + 2) * 2

А вот инфиксная запись 2 + 2 * 2 преобразовывается в постфиксную 2 2 2 * +
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 17:08  [ТС]
5 15 + 4 7 + 1 - / - этот тест дает ответ ноль, а должно быть 2. Либо что-то не так с делением, либо я напортачил, когда переделывал код в вашей программе. Еще по условию должно выполняться это: Программа должна вывести значение переданного ей выражения. Если выражение записано неверно, программа должна вывести слово 'ERROR'.
0
07.07.2018, 17:08

Не по теме:

Fixer_84 vs Википедия :
Фиксер : Но здесь, также, не учтен приоритет операций. Например, 2 2 + 2 * выдаст 8, а должно быть шесть
Википедия : Порядок выполнения операций однозначно задаётся порядком следования знаков операций в выражении, поэтому отпадает необходимость использования скобок и введения приоритетов и ассоциативности операций.
:D

0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 17:11  [ТС]
LegionK, спасибо за ваш ответ. Изначальная программа не проходит только 2 теста (пост #1). Тогда где может быть ошибка? Только сегодня начал изучать ОПЗ.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 17:16
Цитата Сообщение от Fixer_84 Посмотреть сообщение
5 15 + 4 7 + 1 - / - этот тест дает ответ ноль
Да, в моей программе есть косяк, я забыл, что она была написана для одноразрядных чисел. У меня есть другой вариант, используемый мною при написании компилятора, работающий с числами. Могу выложить, если нужно, но сама логика рассчета в ней такая же, только немного изменен код работы с числами.

Добавлено через 3 минуты
UPD. Посмотрел код, там слишком много специфических изменений, проще этот отредактировать.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 17:25  [ТС]
QuakerRUS, хорошо. Тогда жду дальнейшей помощи по посту #1.

Добавлено через 8 минут
QuakerRUS, пока пытаюсь переделать ваш код здесь
C++
1
 if (postfix[i] >= '0' && postfix[i] <= '9')
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 17:59
Что то типа такого.

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
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <cctype>
 
using namespace std;
 
bool error = false;
int evaluatePostfixExpression(const string&);
int isOperator(char);
int calculate(int, int, char);
 
int main() {
    string postfix;
    int result;
    getline(cin, postfix);
    result = evaluatePostfixExpression(postfix);
    if (!error)
        cout << result << "\n";
    else
        cout << "ERROR\n";
    system("pause");
    return 0;
}
 
int evaluatePostfixExpression(const string& s) {
    stack<int> stack;
    istringstream postfix(s);
    int x, y, n, r;
    char c;
 
    while (postfix >> c)
    {
        if (isdigit(c))
        {
            postfix.putback(c);
            postfix >> n;
            stack.push(n);
        }
        else
        {
            if (isOperator(c))
            {
                if (stack.empty())
                {
                    error = true;
                    return 0;
                }
 
                x = stack.top();
                stack.pop();
 
                if (stack.empty())
                {
                    error = true;
                    return 0;
                }
 
                y = stack.top();
                stack.pop();
                stack.push(calculate(y, x, c));
            }
        }
    }
 
    if (stack.empty())
    {
        error = true;
        return 0;
    }
 
    r = stack.top();
    stack.pop();
 
    if (!stack.empty())
        error = true;
 
    return r;
}
 
int isOperator(char c) {
    if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%')
        return 1;
    else
        return 0;
}
 
int calculate(int op1, int op2, char operat) {
    int result;
 
    switch (operat) {
    case '+':
        result = op1 + op2;
        break;
    case '-':
        result = op1 - op2;
        break;
    case '*':
        result = op1 * op2;
        break;
    case '/':
        if (op2 != 0)
            result = op1 / op2;
        else {
            result = 0;
            error = true;
        }
        break;
    case '^':
        result = 1;
        for (int i = 0; i < op2; i++)
            result *= op1;
        break;
    case '%':
        result = op1 % op2;
        break;
    }
    return result;
}
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 18:22  [ТС]
QuakerRUS, я отправил ваш последний код. Он завалил те же два теста, что и у меня в посте #1. Не понимаю, что не так
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 18:24
Fixer_84, у меня только три мысли есть.

1. В моем коде в 83 строке убрать проверку на ^ и %. Маловероятно, что в этом ошибка.
2. В проверке числа больше 4 байт. Мне кажется тоже маловероятным.
3. По условию не говорилось, что числа не могут быть отрицательными. С такой строкой, например, моя программа корректно не отработает в этом случае. Например -2 -2 +
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 18:28  [ТС]
QuakerRUS, отрицательные числа в моей программе были дополнительно учтены, но не в этом дело, к сожалению. У меня -2 -2 + выдает -4.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 18:46
А так если?

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
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <cctype>
 
using namespace std;
 
bool error = false;
int evaluatePostfixExpression(const string&);
int calculate(int, int, char);
 
int main() {
    string postfix;
    int result;
    getline(cin, postfix);
    result = evaluatePostfixExpression(postfix);
    if (!error)
        cout << result << "\n";
    else
        cout << "ERROR\n";
    system("pause");
    return 0;
}
 
int evaluatePostfixExpression(const string& st) {
    stack<int> stack;
    istringstream postfix(st);
    int x, y, n, r;
    string s;
 
    while (postfix >> s)
    {
        if (s == "+" || s == "-" || s == "*" || s == "/")
        {
            if (stack.empty())
            {
                error = true;
                return 0;
            }
 
            x = stack.top();
            stack.pop();
 
            if (stack.empty())
            {
                error = true;
                return 0;
            }
 
            y = stack.top();
            stack.pop();
            stack.push(calculate(y, x, s[0]));
        }
        else
        {
            if (s[0] != '-' && s[0] != '+' && !isdigit(s[0]))
            {
                error = true;
                return 0;
            }
            
            for (int i = 1; i < s.size(); ++i)
            {
                if (!isdigit(s[i]))
                {
                    error = true;
                    return 0;
                }
            }
 
            istringstream ss(s);
            ss >> n;
            stack.push(n);
        }
    }
 
    if (stack.empty())
    {
        error = true;
        return 0;
    }
 
    r = stack.top();
    stack.pop();
 
    if (!stack.empty())
        error = true;
 
    return r;
}
 
int calculate(int op1, int op2, char operat) {
    int result;
 
    switch (operat) {
    case '+':
        result = op1 + op2;
        break;
    case '-':
        result = op1 - op2;
        break;
    case '*':
        result = op1 * op2;
        break;
    case '/':
        if (op2 != 0)
            result = op1 / op2;
        else {
            result = 0;
            error = true;
        }
        break;
    }
    return result;
}
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 19:10  [ТС]
QuakerRUS, все равно. В 15 и 21 тестах - неправильный ответ.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 19:15
Fixer_84, тогда сдаюсь. Кто знает, что за бред они на вход подают, условие слишком короткое и не описаны входные данные. Может они бракуют два пробела подряд, может бракуют пробел в начале или конце строки, может у них unsigned int и они 3 миллиарда подают на вход, может еще больше подают. Гадать не вижу смысла.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 19:20  [ТС]
QuakerRUS, согласен. Но все-таки, обидно, что столько провозились за зря Спасибо, что пытались помочь.

Добавлено через 1 минуту
LegionK, и вам вам спасибо, за поправку. Теперь хоть понимаю что такое ОПЗ.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
07.07.2018, 19:33
Fixer_84, так, я сделал проверки на весь бред, который пришел в голову. Попробуйте еще.

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
123
124
125
126
127
128
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <cctype>
 
using namespace std;
 
bool error = false;
long long evaluatePostfixExpression(const string&);
long long calculate(long long, long long, char);
 
int main() {
    string postfix;
    long long result;
    getline(cin, postfix);
 
    if (postfix.size() == 0 || isspace(postfix[0]) || isspace(postfix[postfix.size() - 1]))
        error = true;
        
    for (int i = 1; i < postfix.size(); ++i)
    {
        if (isspace(postfix[i]) && postfix[i] != ' ' || postfix[i - 1] == ' ' && postfix[i] == ' ')
            error = true;
    }
    
    if (!error)
        result = evaluatePostfixExpression(postfix);
 
    if (!error)
        cout << result << "\n";
    else
        cout << "ERROR\n";
    system("pause");
    return 0;
}
 
long long evaluatePostfixExpression(const string& st) {
    stack<long long> stack;
    istringstream postfix(st);
    long long x, y, n, r;
    string s;
 
    while (postfix >> s)
    {
        if (s == "+" || s == "-" || s == "*" || s == "/")
        {
            if (stack.empty())
            {
                error = true;
                return 0;
            }
 
            x = stack.top();
            stack.pop();
 
            if (stack.empty())
            {
                error = true;
                return 0;
            }
 
            y = stack.top();
            stack.pop();
            stack.push(calculate(y, x, s[0]));
        }
        else
        {
            if (s[0] != '-' && s[0] != '+' && !isdigit(s[0]))
            {
                error = true;
                return 0;
            }
            
            for (int i = 1; i < s.size(); ++i)
            {
                if (!isdigit(s[i]))
                {
                    error = true;
                    return 0;
                }
            }
 
            istringstream ss(s);
            ss >> n;
            stack.push(n);
        }
    }
 
    if (stack.empty())
    {
        error = true;
        return 0;
    }
 
    r = stack.top();
    stack.pop();
 
    if (!stack.empty())
        error = true;
 
    return r;
}
 
long long calculate(long long op1, long long op2, char operat) {
    long long result;
 
    switch (operat) {
    case '+':
        result = op1 + op2;
        break;
    case '-':
        result = op1 - op2;
        break;
    case '*':
        result = op1 * op2;
        break;
    case '/':
        if (op2 != 0)
            result = op1 / op2;
        else {
            result = 0;
            error = true;
        }
        break;
    }
    return result;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.07.2018, 19:43
Fixer_84, я редко понимаю происходящее и поэтому люблю что-нибудь сказать. Объясните пожалуйста, зачем тут стек? Я не стал играть со строковыми потоками и/или парсингом, чтобы максимально упростить вопрос. Ведь если Вам не нужны скобки, то операция всегда порождает результат и в этом её прелесть. То есть механизм туп и прост как веник:
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
// prg_title обратная польская запись без скобок
#include<iostream>
#include<string>
using namespace std;
int main(int argv, char*argc[])
{
double result, operand;
string operation("="), operations("+-*/=");
cin>>result;
do
    {
cin>>operand;
cin>>operation;
int ind_op=operations.find(operation);
cout<<"ind= "<<ind_op<<" which means "<<operations[ind_op]<<endl;
switch(ind_op)
{
    case 0: result+=operand; break;
    case 1: result-=operand; break;
    case 2: result*=operand; break;
    case 3: result/=operand; break;
    default:; break;
}
cout<<result<<endl;
    }
while(operation!="=");
 
cout<<"Rezult is "<<result<<endl;
 
 cin.get();
    return 0;
}
Однако нужно вводить число или операцию без ошибок, завершая Вводом конечно. То есть, сначала пара чисел. А потом первая операция. Затем, - число чередуется с операцией. Пока не надоест.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
07.07.2018, 19:45  [ТС]
QuakerRUS, возможно, мне удалось найти потенциальную ошибку, так как код при отправке на сайте Е-olymp принимают, но там нет проверки на вывод сообщения ERROR. Вывод - мы где-то в одном(двух) местах неправильно выводим сообщение ERROR или не выводим вообще. Вот этот код прошел все тесты на E-olymp:

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
#include <bits/stdc++.h>
 
    using namespace std;
 
int main() {
    int a, b;
    bool flag = false;
    stack<int> st;
    string s, ex;
    getline(cin, s);
    stringstream str(s);
    while (str >> ex) {
        if (!(ex == "-" || ex == "+" || ex == "*" || ex == "/")) st.push(atoi(ex.c_str()));
        else {
            if (!st.empty()) {
                b = st.top();
                st.pop();
            }
            if (!st.empty()) {
                a = st.top();
                st.pop();
            }
            switch (ex[0]) {
            case '+':
                st.push(a + b);
                break;
            case '-':
                st.push(a - b);
                break;
            case '*':
                st.push(a * b);
                break;
            case '/':
                st.push(a / b);
                break;
            }
        }
    }
    if (!st.empty() && !flag) {
        int c = st.top();
        st.pop();
        if (st.empty()) {
            cout << c << "\n";
        }
    }
    system("pause");
    return 0;
}
P.S. Сейчас попробую отправить ваш новый код...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2018, 19:45
Помогаю со студенческими работами здесь

Обратная польская запись
Нужно создать класс с++ для вычисления обратной польской записи с помощь стека.

Обратная польская запись
Написать программу формирования ОПЗ и расчета полученного вы-ражения. Разработать удобный интерфейс ввода исходных данных и вывода...

Обратная Польская Запись
Сам вопрос: Я написал программу, она работает, но препод по Структурам данных сломал ее в два счета. Я нашел ошибку, но как ее исправить...

Обратная польская запись
Нужна помощь. Есть программа с общей польской записью. Программа принимает только буквенное выражение ( например: &quot;a+b+c*d&quot; и...

Обратная польская запись
Что такое обратная польская запись и как её реализовать на С++? Почему когда в программе я пишу a=2+2; всё считает нормально, а когда пишу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru