Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
1

Стековый калькулятор, как подправить код?

13.10.2015, 14:42. Просмотров 495. Ответов 6
Метки нет (Все метки)

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

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
# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <stack>
# include <string>
 
using namespace std;
 
int calculate(string str_in);
bool isNumber(string str_in);
 
int main()
{
    str_in = "2 3 + 15 7 - *" 
    int a = calculate();
    cout << a;
    return 0;
}
 
int calculate(string str_in) {
 stack <int> val_stack; //стек
 int n1, n2, res;
 for(int i = 0; i<str_in.length(); ++i) {
 if(isNumber(str_out[i])) {
 val_stack.push(str_out[i]);
 }
 else {
 n2 = val_stack.pop();
 n1 = val_stack.pop();
 switch(str_out[i]) {
 case '+': res = n1 + n2; break;
 case '-': res = n1 - n2; break;
 case '*': res = n1 * n2; break;
 case '/': res = n1 / n2; break;
 default: cout<<"Error!\n";
 }
 val_stack.push(res);
 }
 }
 return val_stack.pop();
}
 
 
bool isNumber(string str_in)
{
    if ((str[0]>=48)&&(str[0]<=57))
        return true;
    else
        return false;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2015, 14:42
Ответы с готовыми решениями:

Стековый калькулятор
Помогите пожалуйста, есть калькулятор стековый который работает со сложением...

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

Постфиксный (стековый) калькулятор (Рекурсия)
Задание: Реализовать постфиксный (стековый) калькулятор, 4 действия,...

Стековый калькулятор - успешная компиляция и неуспешная работа
Пытаюсь написать стековый калькулятор работающий с введенной строкой(курсач...

Выводит немного не то что надо ,как подправить код
Всем привет, подскажите плиз как сделать так . 1)Если я ввожу числа больше 10...

6
_Valera_
489 / 371 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
13.10.2015, 15:11 2
Цитата Сообщение от JavJun Посмотреть сообщение
int a = calculate();
Цитата Сообщение от JavJun Посмотреть сообщение
int calculate(string str_in) {
требует параметр

Добавлено через 2 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
if(isNumber(str_out[i])) {
откуда взялся str_out?

Добавлено через 5 минут
Цитата Сообщение от JavJun Посмотреть сообщение
bool isNumber(string str_in)
{
* * if ((str[0]>=48)&&(str[0]<=57))
* * * * return true;
* * else
* * * * return false;
}
параметр str_in, а используешь str.
0
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
13.10.2015, 15:11  [ТС] 3
_Valera_, подправил и чуть упростил, но все равно что-то не так...(
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
# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <stack>
# include <string>
 
using namespace std;
bool isNumber(string str);
 
int main()
{
 
   string str = "2 3 + 15 7 - *";
   int a = calc();
   cout << a;
   return 0;
}
 
 int calc(string str){
 stack <int> numbers;
 int a, b, res;
 for(int i = 0; i<numbers.length(); ++i) {
 if(isNumber(numbers[i])) {
 numbers.push(numbers[i]);
 }
 else {
 b = numbers.pop();
 a = numbers.pop();
 switch(numbers[i]) {
 case '+': res = a + b; break;
 case '-': res = a - b; break;
 case '*': res = a * b; break;
 case '/': res = a / b; break;
 default: cout<<"Error!\n";
 }
 numbers.push(res);
 }
 }
 return numbers.pop();
}
 
 
bool isNumber(string str)
{
    if ((str[0]>=48)&&(str[0]<=57))
        return true;
    else
        return false;
}
0
_Valera_
489 / 371 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
13.10.2015, 15:22 4
так лучше:
C++
1
2
3
4
5
bool isNumber(const char str)
{
    return((str>=48) && (str<=57));
 
}
Добавлено через 1 минуту
Цитата Сообщение от JavJun Посмотреть сообщение
int a = calc();
не подправил...

Добавлено через 44 секунды
Цитата Сообщение от JavJun Посмотреть сообщение
int calc(string str){
еще теперь она ее не увидит

Добавлено через 2 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
numbers.push(res);
ты в интовый стек толкаешь чаровские числа, нужно учитывать приведение типов.

Добавлено через 4 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
str_in = "2 3 + 15 7 - *"
да, не заметил сразу где тип переменной? И точка с запятой
0
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
13.10.2015, 15:25  [ТС] 5
_Valera_, так в main нужно оставить int a = calc(); а при вызове ф-ции написать int calculate(string str) { ?

"ты в интовый стек толкаешь чаровские числа, нужно учитывать приведение типов." - а можно тогда сделать так?
C++
1
stack <char> numbers;
0
_Valera_
489 / 371 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
13.10.2015, 15:37 6
Цитата Сообщение от JavJun Посмотреть сообщение
numbers.pop();
эта функция void

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
# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <stack>
# include <string>
 
using namespace std;
 
int calculate(const string & str_in);
bool isNumber(const char str);
 
int main()
{
    string str = "23+157-*" ;
    int a = calculate(str);
    cout << a;
    system("PAUSE");
    return 0;
}
 
int calculate(const string & str_in) 
{
    stack <int> val_stack; //стек
    int n1 = NULL, n2 = NULL, res = NULL;
    for(int i = 0; i<str_in.length(); ++i) 
    {
        if(isNumber(str_in[i])) 
            val_stack.push(str_in[i]-48);
        
        else
        {
            n2 = val_stack.top();
            val_stack.pop();
            n1 = val_stack.top();
            val_stack.pop();
            switch(str_in[i]) {
            case '+': res = n1 + n2; break;
            case '-': res = n1 - n2; break;
            case '*': res = n1 * n2; break;
            case '/': res = n1 / n2; break;
            default: cout<<"Error!\n";
            }
            val_stack.push(res);
        }
    }
    
    return val_stack.top();
}
 
 
bool isNumber(const char str)
{
    return (str>=48 && str<=57);
 
}
Добавлено через 2 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
string str = "2 3 + 15 7 - *"
Программа должна учитывать пробелы... и вобще это серьезный удар по твое реализации, потому что число 15 например займет две ячейки, а ты проверяешь только одну.
1
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
13.10.2015, 16:07  [ТС] 7
_Valera_, это она из-за этого вылетает если string str = "2 3 + 15 7 - *"?
А подскажите пожалуйста, возможно ли это как-то исправить?
0
13.10.2015, 16:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2015, 16:07

Подправить код
Помогите пожалуйста, нужно подправить код: /* Дана целочисленная квадратная...

Подправить код
#include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;ctype.h&gt; using namespace...

Подправить код
Ввожу строку с 30 символов. Нужно вывести целое число и упорядочить за...


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

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

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