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

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

07.07.2018, 15:46. Показов 8227. Ответов 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
9005 / 4706 / 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru