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

Рекурсивное вычисление постфиксного выражения без стека(!) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ С++ и Ассемблерная вставка/чтение SPD ОЗУ http://www.cyberforum.ru/cpp/thread1389011.html
Добрый день форумчане, делаю программу на подобии CPU-Z, необходимо узнать тайминги и прочую информацию из SPD оперативной памяти. Нашел код Asssmbler на просторах интернета, но без понятия как его...
C++ Как сделать Game over в игре Здравствуйте, разрабатываю змейку через OpenGL на с++ и в принципе игра работает , но хотелось бы как то сделать что бы если змейка выползает за границы игрового поля выскакивала надпись или может... http://www.cyberforum.ru/cpp/thread1387920.html
C++ Блокировка мыши по оси y
Здравствуйте! Нужно решить задачу: Вычислять текущую позицию по оси y, и при нажатии ctrl(control)+1 блокировать мышь по этой оси, т.е чтоб y был равен всегда тому значению, которое было при...
C++ Парсер выражений
Здравствуйте, помогите пожалуйста написать простой парсер, для дальнейшей самостоятельной доработки под нужды. Ссылки на гугл и прочее не интересует, перерыл уже. мне нужно консольное приложение,...
C++ Топологическая сортировка http://www.cyberforum.ru/cpp/thread1386242.html
Есть алгоритм, реализация с помощью обхода в глубину: http://rain.ifmo.ru/cat/view.php/vis/graph-general/topological-sort-2007/algorithm boolean topological_sort(){ boolean Cycle; ...
C++ Урок геометрии, масштабирование изображений Задача: Есть картинка 100x100 px на которой нарисован смайлик необходимо наложить этот смайлик на другие фотографии, размер которых заранее неизвестен. (Я в курсе как программно наложить одну... подробнее

Показать сообщение отдельно
ShinaZin
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
07.03.2015, 10:32  [ТС]
Входная строка - массив символов, например 93+6-, для простоты считаем, что числа состоят из одной цифры, а разделителей (типа пробела) нет, это для варианта выше. Кстати, скобок в постфиксной записи я не припомню. А сам я уже написал вариант программы, который обрабатывает строки примерно такого вида: 27 90 - 110 + 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
#include <iostream>
#include <cstring>
 
using namespace std;    
float eval();
char str[255];
int i = 0;
 
int main(int argc, char *argv[]) 
{
    if(argc==1) {
      cout<<"Input postfix string: "; gets(str);
  }
    else strcpy(str,argv[1]);//чтение строки из параметров запуска
    i = strlen(str)-1;//Индекс = последний символ, не '\0'
    cout<<str<<" = "<<eval()<<'\n';//вычисление выражения
    return 0;
}
 
float eval()
{
    float x = 0;
    while (str[i]==' ') i--;
 
    if (str[i] == '+')
    {
        i--;
        x=eval() + eval();
        return x;
    }
 
    if (str[i] == '*')
    {
        i--;
        x=eval() * eval();
        return x;
    }
    
    if (str[i] == '/')
    {
        i--;
        x=eval() / eval();
        return 1.0/x; //обратное значение, из-за обратного порядка вычисления
    }
    
    if (str[i] == '-')
    {
        i--;
        x=eval() - eval();
        return -1*x; //обратное значение
    }
    if (str[i] == '^')
    {
        i--;
        int n,p,j, res=1;
        n=eval();//возводим число p
        p=eval();//в степень n
        for(j=0;j<n;j++)
          res*=p;
        return res;
    }
    int w=1;//"вес" очередной цифры
    while((str[i] >= '0') && (str[i] <= '9')){
        x = x + (str[i--] - '0')*w;
        w*=10;
    }
        
    return x;
}
PS: работает только для целых чисел, хотя исправлять не много там для работы с дробями. Ну и нет "защиты от дураков", кому надо - допилят
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru