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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
#1

Обратная польская запись - C++

31.05.2011, 14:27. Просмотров 1480. Ответов 0
Метки нет (Все метки)

Задание: надо посчитать значения выражения ОПЗ
в первоим листинге, у меня все работает, но там он работает без приоритетов, и в этом определенная проблема
во втором, я расставляю приоритеты и добавляю скобки, и тут начинается проблема, с закрывающейся скобкой, точнее с удалением скобок () и выражения внутри с заменой на число, ведь по приоритету скобки выполняются первыми
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
#include "stdafx.h"
#include <stdio.h>
#include "locale.h"
#include <string.h>
#include "iostream"
#include "conio.h"
using namespace std;
int main(void)
{
    setlocale (LC_ALL, "Russian");
       int stack[100];// выходная строка
        int m = 0;//cчетчики
        char q[100];// массив введеных данных
        int res;
            
        printf("Введите выражение: ");
        gets(q);
        for (int i = 0; i < strlen(q); i++)
        {
                if (q[i] >= '0' && q[i] <= '9')
                {
 
                        stack[m] = q[i] - '0';
                        m++;
                }
                switch (q[i])
                {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                stack[m-2]=res;
                                m--;
 
 
                }
        }
        printf("Ответ: %d", res);
        getchar();
        return 0;
}
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
#include "stdafx.h"
#include <stdio.h>
#include "locale.h"
#include <string.h>
#include "iostream"
#include "conio.h"
using namespace std;
int m=0;
const int N=10;
int S[N];
int STACK_EMPTY(int S[N])       //функция проверяет пуст ли стек
{
if (m==0) return true;
else return false;
}; 
 
int pop(int S[N])                  // извлечение из стека 
{
if (STACK_EMPTY(S))    printf("error underflow \n");
else m=m-1;
    return S[m];
};
 
int main(void)
{
    setlocale (LC_ALL, "Russian");
       int stack[100];// выходная строка
        int m = 0, f=0, t=0;//cчетчики
        char q[100];// массив введеных данных
        
        int res, u;
        int p[35]; // приоритет знака 1-наим, 2-меньший, 3-нивысш
    
        printf("Введите выражение: ");
        gets(q);
        for (int i = 0; i < strlen(q); i++)
        {
                if (q[i] >= '0' && q[i] <= '9')
                {
 
                        stack[m] = q[i] - '0';
                        m++;
                }
                else 
                    if(q[i]=='+'||q[i]=='-')
                    {
                        p[f]=2;
                        f++;
                    }
                    else
                        if(q[i]=='*'||q[i]=='/')
                            {
                                p[f]=3;
                                f++;
                            }   
                        else
                            if(q[i]=='(')
                            {
                                p[f]=1;
                                f++;
                            }
                        else
                            if(q[i]==')')
                            {
                                p[f]=4;
                                f++;
                            }
 
                            
        if(p[t]<p[t+1])
        {
                switch (q[i])
                {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '(':
                        {
                                stack[m] = q[i];
                                u=m; // начало скобки
                                break;
                        }
                        case ')':
                        {
                            int y=m-u;// длина скобок
                            //stack.splice(u,y);// начиная с индекса u удалить y элементов
                            for(int j=0; j<y; j++)
                            {
                                int a=pop(stack);
                            }
                            stack[m]=res;
                            
                        }   
 
                }
        }
        }
        printf("Ответ: %d", res);
        getchar();
        return 0;
}
Добавлено через 10 часов 9 минут
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
#include "stdafx.h"
#include <stdio.h>
#include "locale.h"
#include <string.h>
#include "iostream"
#include "conio.h"
using namespace std;
int m=0;
const int N=10;
int S[N];
 
int main(void)
{
    setlocale (LC_ALL, "Russian");
       int stack[100], s[50];// выходная строка
        int m = 0, f=0, t=0;//cчетчики
        char q[100];// массив введеных данных   
        int res, u;
        int p[35]; // приоритет знака 1-наим, 2-меньший, 3-нивысш
    
        printf("Введите выражение: ");
        gets(q);
        for (int i = 0; i < strlen(q); i++)
        {
                if (q[i] >= '0' && q[i] <= '9')
                {
                        stack[m] = q[i] - '0';
                        m++;
                }
                else 
                    if(q[i]=='+'||q[i]=='-')
                    {
                        p[f]=2; s[f]=q[i]; f++;
                        
                    }
                    else
                        if(q[i]=='*'||q[i]=='/')
                            {
                                p[f]=3;
                                s[f]=q[i]; f++;
                            }   
                        else
                            if(q[i]=='(')
                            {
                                p[f]=1; s[f]=q[i]; f++;
                                
                            }
                        else
                            if(q[i]==')')
                            {  
                                p[f]=4; s[f]=q[i]; f++;
                                
                            }   
        }
        for(int i=0; i<f; i++)
        {
                switch (s[i])
                {
                    if(p[i]<=p[i+1])
                        {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '(':
                        {
                                stack[m] = q[i];
                                u=m; // начало скобки
                                break;
                        }
                        case ')':
                        {
                            int y=m-u;// длина скобок
                            for(int j=y; j>=u; j--)
                            {
                                stack[j]=NULL;
                                m--;
                            }
                            stack[m]=res;       
                        }   
                    t++;
                }
        }
}
 
        
        printf("Ответ: %d", res);
        getchar();
        return 0;
}
Тот трабл я решила, теперь проблема с приоритетом... считает не правильно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2011, 14:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обратная польская запись (C++):

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

Обратная польская запись - C++
Простите что не совсем в том разделе, просто его больше всего людей посещает) По теме: Как при вычислении выражения из строки...

Обратная польская запись - C++
Подскажите, как по обратной польской записи выражения построить дерево выражения Например: дана запись 1 2 + 3 4...

Обратная польская запись - C++
Здравствуйте, изучаю обратную польскую запись, столкнулся с такой проблемой: Перерыл множество алгоритмов перевода из обычной записи в...

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2011, 14:27
Привет! Вот еще темы с ответами:

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

Обратная польская запись. С++ - C++
Необхдимо дописать программу, что бы она работала с унарным минусом. Обратная польская запись, С++. #include &lt;iostream&gt; #include...

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

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


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

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

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