Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Gregoirious
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 2
1

Посчитать значение выражения, записанного в обратной польской нотации

29.09.2016, 23:31. Просмотров 470. Ответов 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
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
#include<iostream>
#include<vector>
#include<string>
#include<EXTRA.h>
using namespace std;
 
struct stack{
    int value;
    stack *next;
};
 
int main(){
    setlocale(LC_ALL, "Russian");
    cout << "Введите выражение, записанное в обратной польской нотации: ";
    vector <stack> A;
    string sym;
    getline(cin, sym);
    if (sym[0] >= '0' && sym[0] <= '9'){
        A.push_back(stack());
        A[0].value = sym[0] - '0';
        A[0].next = NULL;
    }
    else{
        cout << "НЕКОРРЕКТНЫЙ ВВОД\n";
        system("pause");
        return 0;
    }
    stack *current = &A[0];
    for (int i = 1; i < sym.size(); i++){
        cout << i << endl;
        current = &A[A.size()-1];
        if (sym[i] == ' ') continue;
        if (sym[i] >= '0' && sym[i] <= '9'){
            A.push_back(stack());
            A[A.size()-1].value = sym[i] - '0';
            A[A.size()-1].next = &A[A.size()-2];
            continue;
        }
        if (A.size() > 1){
            if (sym[i] == '+'){
                current->next->value = current->value + current->next->value;
                A.pop_back();
                continue;
            }
            if (sym[i] == '-'){
                current->next->value = current->value - current->next->value;
                A.pop_back();
                continue;
            }
            if (sym[i] == '*'){
                current->next->value = current->value * current->next->value;
                A.pop_back();
                continue;
            }
            if (sym[i] == '/'){
                current->next->value = current->value / current->next->value;
                A.pop_back();
                continue;
            }
            if (sym[i] == '^'){
                current->next->value = power(current->value, current->next->value);
                A.pop_back();
                continue;
            }
        }
        cout << "НЕКОРРЕКТНЫЙ ВВОД\n";
        system("pause");
        return 0;
    }
    if (A.size() > 1) cout << "НЕКОРРЕКТНЫЙ ВВОД\n";
    else cout << "Значение выражения равно: " << A[0].value << endl;
    system("pause");
    return 0;
}
При вводе корректных выражений, содержащих хотя бы два знака подряд, например "567++", выдаёт следующую ошибку:

ОС Windows инициировала точку останова в Занятие 5, С,С++.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в Занятие 5, С,С++.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Занятие 5, С,С++.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки

P.S. В библиотеке EXTRA.h содержится функция power, которая возводит число a в степень b
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2016, 23:31
Ответы с готовыми решениями:

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

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

Вычислить значение выражения в обратной польской записи с использованием стека
Вычислить значение выражения в обратной польской записи с использованием стека. например 6 2 + = 6...

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

Калькулятор считающий выражения обратной польской записи из файла
Здравствуйте! У меня вот такое задание &quot;Напишите программу, вычисляющую выражение в обратной...

2
regio1961
271 / 148 / 117
Регистрация: 06.06.2016
Сообщений: 351
30.09.2016, 10:51 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 #include <iostream>
 #include <vector>
 #include <stack>
 #include <set>
 #include <sstream>       
 using namespace std;
 //-------------------------------------------------------------------
 double string_2_double( const string &str )
 {
   double x = 0.0;
   istringstream( str ) >> x ;
   return x;
 }
 //-------------------------------------------------------------------
 double  operations( const double &op1,
                     const double &op2,
                     const char   &operation )
 {
   double result = 0.0;
       switch ( operation )
       {
         case ( '+' ):  result = op1 + op2;
                        break;
         case ( '-' ):  result = op1 - op2;
                        break;
         case ( '*' ):  result = op1 * op2;
                        break;
         case ( '/' ):  result = op1 / op2;
                        break;
       }
   return result;
 }
 //-------------------------------------------------------------------
 double evaluate_polish_expr( const vector<string> &expr )
 {
   const set<string> operators = { "+", "-", "*", "/" };
   stack<double>     *operands   = new stack<double>();
       for ( const auto &e : expr )
       {
             if ( operators.find( e ) != operators.end() )
             {
               double  x2 = operands->top();
               operands->pop();
               double  x1 = operands->top();
               operands->pop();
               operands->push( operations( x1, x2, e[0] ) );
             }
             else
               operands->push( string_2_double( e ) );
       }
   return operands->top();
 }
 //-------------------------------------------------------------------
 int main()
 {
   vector<string> polish_expr = { "5", "6", "7", "+", "+" };
       for ( const auto &s : polish_expr )
         cout << s << " ";
   cout << endl;
   cout << evaluate_polish_expr( polish_expr );
   return  0;
 }
Сами добавьте оператор "^".
1
Gregoirious
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 2
30.09.2016, 14:14  [ТС] 3
Спасибо за код, но у меня было задание написать программу, использующую односвязный список структур. Я написал её, но она почему-то не работает с выражениями, содержащими два знака подряд.
Помогите, пожалуйста, разобраться, где ошибка в моём коде!

Добавлено через 3 часа 1 минуту
Цитата Сообщение от Gregoirious Посмотреть сообщение
Помогите, пожалуйста, разобраться, где ошибка!
Я разобрался! Оказывается, функция pop.back() меняет адреса элементов!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2016, 14:14

нужно чтобы вводимый код считал вводимые значения в польской нотации,найдите пожалуйста ошибку
char stack1; int sp = 0; for (int sp = 0;sp &lt;= 100;sp++) { double stack2; cin &gt;&gt;...

Функция вычисляющая значение выражения, записанного в постфиксной форме в текстовом файле
Описать функцию value (postfix), которая вычисляет как целое число значение выражения (без...

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


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

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

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